shiro實現基於角色的許可權授權
阿新 • • 發佈:2018-12-25
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方法設定角色和許可權
下一步就是在controller層的方法中新增對應的許可權註解,這樣才能讓上面的程式碼有效從而達到對系統許可權控制的目的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方式,並且這兩種方式可以一起用,達到自己所設想的效果。