shiro除了登陸驗證之外,還有一點就是對系統進行相應的權限操作,而基於角色的授權是目前最通用的做法,也是符合業務邏輯的。具體思路如下:
1.數據庫設計好權限表,角色表(權限標識是自定義的,shiro會根據表格裏面相應的權限對系統做出管理)
2.將權限表與角色表做外鍵關聯(多對一),用戶表與角色表做外鍵關聯
3.在自定義的Realm裏實現授權
4.在controller層的方法里加上對應權限(推薦使用註解,只是需要在配置文件中開啓註解,這點自行百度,並無什麼難點)
開啓shiro註解的配置如下:
<!--配置lifecycleBeanPostProcessor, 可以自動的來調用配置在spring IOC 容器中shiro bean的生命週期方法-->
<bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor" />
<!--啓用IOC容器中使用shiro的註解,但必須在配置 lifecycleBeanPostProcessor纔可以使用–>-->
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"
depends-on="lifecycleBeanPostProcessor">
<property name="proxyTargetClass" value="true" />
</bean>
<bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
<property name="securityManager" ref="securityManager"/>
</bean>
<!--掃描所有shiro註解的文件-->
<context:component-scan base-package="action">
<context:exclude-filter type="annotation"
expression="org.springframework.stereotype.Controller" />
</context:component-scan>
對數據庫的建表等操作就不給出來了,這點需要自己實現,下面就是授權代碼:
大體流程是:先從數據中查找出該用戶的對應角色,然後通過角色找出對應的權限,然後再通過add方法設置角色和權限
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
// System.out.println("授權");
SimpleAuthorizationInfo info=new SimpleAuthorizationInfo();
List<String> permissions=new ArrayList<>();
List<String> roles=new ArrayList<>();
String username= (String) principalCollection.getPrimaryPrincipal();
// System.out.println("username"+username);
croUser=croUserService.findUserByName(username);
List<CroRoleRoot> croRoleRoots=croRoleRootService.FindRootByRoleId(croUser.getCroRole().getId());
for(CroRoleRoot croRoleRoot:croRoleRoots){
String permission=croRootService.FindRootById(croRoleRoot.getCroRoot().getId()).getRoot();
// System.out.println("權限:"+permission);
permissions.add(permission);
}
roles.add(croUser.getCroRole().getRolename());
info.addRoles(roles);//設置角色
info.addStringPermissions(permissions);//設置權限
return info;
}
@RequiresPermissions("user:select")//對應權限註解
public String listCoupons(){
upcroCoupons=croCouponsService.FindCouponsByid(id);
return "updatecoupons";
}
接着就可以進行測試操作了,當無權限的時候,會拋出一個無權限異常,用戶的操作不會有任何效果。
注:註解只是其中一種方式,還有直接使用if-else判斷和shiro標籤的方式。建議學習shiro的程序猿去看看註解和shiro方式,並且這兩種方式可以一起用,達到自己所設想的效果。