天天看點

jeesite的shiro流程

      由于項目内部cms的快速開發需要,選型使用jeesite進行實作,于是也好好的對shiro的流程進行了學習,其中由于使用者在登入之前就需要選擇産品分類,登入後也需要能進行切換。考慮過使用自定義的filter将該值進行注入到httpsession中,但是發現當使用者登入成功卻換了一個session(logger.info了sessionId發現不是同一個東西),于是使用過下面的方式直接将其與目前登入使用者的Subject進行綁定。流程大緻總結如下:

1、使用者在浏覽器端通路應用

2、跳轉至LoginController的login方法,forward至sysLogin.jsp(登入頁面)

3、使用者填寫:使用者名、密碼、驗證碼、産品(主題切換不包含在表單中),并送出表單。

4、所有請求進入shiro架構的DelegatingFilterProxy代理對象ShiroFilterFactoryBean。

      一般流程為配置ShiroFilter,繼承自父類AbstractShiroFilter(屬性WebSecurityManager 繼承自shiro的核心,安全管理器SecurityManager)。

5. ShiroFilterFactoryBean内部主要包含屬性(屬性值從配置檔案中進行擷取)如下:

    1、securityManager(shiro核心安全管理器) 

    2、loginUrl(登入位址) 

    3、successUrl(登入成功位址)

    4、Map<String, Filter> filters

         1、Shiro的CasFilter,然而該項目不存在sso的情況,是以不進行追蹤。

         2.1、FormAuthenticationFilter 繼承自Filter的FormAuthenticationFilter類型并重寫和添加的屬性如下:

                      validateCode:驗證碼

                      mobileLogin:是否手機登入表示(現在沒有進行使用,後續可能會使用)

                      projectId:使用者在登陸前選擇的産品ID

         2.2   第一、重寫父類的Shiro的FormAuthenticationFilter父類的createToken()方法,

                 第二、并傳回自定義的 UsernamePasswordToken對象(裡面包含産品ID屬性)繼承自shiro的UsernamePasswordToken對象

                 第三、Shiro的FormAuthenticationFilter extends AuthenticatingFilter 

                              而自定義的FormAuthenticationFilter extends shiro的FormAuthenticationFilter extends AuthenticatingFilter

    5、Map<String, String> filterChainDefinitionMap

                  說明:對于以下filter的攔截URL配置如下(都為Shiro内部的Filter):

         1) 都可以進行通路的靜态資源檔案:

                     /static/** = anon

                     /userfiles/** = anon

          2)CasFilter攔截的url :

                     ${adminPath}/cas = cas

          3)authcFilter:

                     ${adminPath}/login = authc

          4)logoutFilter:

                     ${adminPath}/logout = logout

          5)userFilter :

                     ${adminPath}/** = user

                      /act/editor/** = user

                     /ReportServer/** = user

    6、SecurityManager的實作DefaultWebSecurityManager,包含以下對象,從配置中進行擷取

             1)SystemAuthorizingRealm extends AuthorizingRealm并從寫父類的方法将資料源realm進行注入,

             2)經filterChain的關鍵filter FormAuthenticationFilter 将包含産品ID的UsernamePasswordToken對象進行傳入

             3)SystemAuthorizingRealm使用使用重寫父類的doGetAuthenticationInfo方法,傳遞的參數SimpleAuthenticationInfo中包含其内部類Principal,

                     Principal包含使用者登入前選擇的産品資訊,以進行使用者名密碼驗證(若登入過則從UserUtils緩存中進行擷取傳回對象)

                     并将projectId注入SecurityUtils的目前使用者Subject中

             4)使用者登入成功後的切換産品ID也直接拿到目前的使用者Subject并進行替換即可。

繼續閱讀