天天看點

粗粒度權限認證

一、在web.xml中配置過濾器:

        過濾器配置在Struts2過濾器的前面,攔截所有

        過濾器的filter-name與spring配置檔案過濾器bean的id一緻-->shiroFilter

二、配置applicationContext-shiro.xml:

        1、配置shiro的核心過濾器,過濾器的id與web.xml中的filter-name一緻-->ShiroFilterFactoryBean

        2、在核心過濾器中配置,安全管理器securityManager

 未認證跳轉的頁面loginUrl

 登入認證後的頁面successUrl

 認證後為授權的頁面unauthorizedUrl

 配置過濾器鍊filterChainDefinitions

anno未認證可以通路 /login.html* = anno

authc認證後可以通路

perms特點權限通路 /.. = perms[x,x,x...]

roles特點角色通路 /.. = roles[y,y,y...]

port特點端口可以通路

reset特點http請求可以通路

一個*指參數

兩個*指子檔案夾

3、配置安全管理器,DefaultWebSecurityManager

注入自定義realm

4、配置後處理器,生命周期,LifecycleBeanPostProcessor

三、在action層中:

1、建立Subject subject = SecurityUtils.getSubject();

2、建立一個UsernamePasswordToken将使用者資訊儲存到token中

3、調用subject對象的login方法傳入token

四、在自定義Realm中,繼承AuthorizingRealm

1、在認證的方法中,doGetAuthenticationInfo,将token對象轉為UsernamePasswordToken對象

2、根據token的getUsername()方法擷取使用者名,根據使用者名查詢使用者

使用者不存在傳回null

使用者存在,傳回new SimpleAuthenticationInfo(user, user.getPassword(), getName());

認證後儲存在Project中的使用者資訊;密碼;realm名稱;

3、在底層會比對查詢的密碼和使用者輸入的密碼

4、在權限檢驗的方法中,doGetAuthorizationInfo

建立一個AuthorizationInfo的實作類對象SimpleAuthorizationInfo

回去Subject對象,該對象存儲了使用者的資訊

調用subject對象的getPrincipal()方法,擷取使用者對象

查詢使用者的角色和權限資訊,将這些資訊存儲到SimpleAuthorizationInfo中

傳回SimpleAuthorizationInfo

底層會比對配置檔案通路所需的權限與角色和傳回的使用者的有的角色和權限

五、拓展

一般過濾器鍊中的roles配置多個後就需要使用者同時滿足多個角色,但在實際情況中應該是或關系

如何配置角色或關系:

1、自定義一個過濾器,繼承AuthorizationFilter

2、重寫方法,根據getSubject(req,resp),建立一個Subject對象,該對象中有使用者的角色資訊和權限資訊

3、将重寫方法的Object參數轉成數組,String[] rolesArray = (String[])mappedValue;

4、先判斷數組是否為null或數組長度為空,如滿足,則說明無角色限制,有權限通路,傳回true

5、周遊數組,根據subject.hasRole(rolesArray[i])判斷使用者是否滿足任意一個角色,若滿足,則有權限通路,傳回true

6、在spring的配置檔案中,配置自定義過濾器的bean

7、在shiro的核心過濾器bean上設定depends-on="指定自定義過濾器的id"

8、在shiro的核心過濾器中配置自定義過濾器的參數filters,其為map集合

9、将過濾器鍊的roles替換為自定義過濾器

繼續閱讀