1. 程式人生 > >shiro實現基於角色的許可權授權

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方式,並且這兩種方式可以一起用,達到自己所設想的效果。