shiro實現基於角色的權限授權

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;
    }



下一步就是在controller層的方法中添加對應的權限註解,這樣才能讓上面的代碼有效從而達到對系統權限控制的目的

  @RequiresPermissions("user:select")//對應權限註解
    public String listCoupons(){
        upcroCoupons=croCouponsService.FindCouponsByid(id);
        return "updatecoupons";
    }

接着就可以進行測試操作了,當無權限的時候,會拋出一個無權限異常,用戶的操作不會有任何效果。



注:註解只是其中一種方式,還有直接使用if-else判斷和shiro標籤的方式。建議學習shiro的程序猿去看看註解和shiro方式,並且這兩種方式可以一起用,達到自己所設想的效果。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章