1. 程式人生 > >SSO CAS記住密碼免登陸資訊配置

SSO CAS記住密碼免登陸資訊配置

                    SSO CAS記錄密碼免登陸操作    

    該篇博文轉自https://www.imooc.com/article/3729

    登入時,為了提高使用者體驗,在登入時,可以選擇是否記住密碼,從而使再次登入時無需輸入密碼,及記住密碼操作,CAS 本身就提供了這種記住密碼的操作,具體配置資訊如下:

    記住密碼也是我們登入常提供的功能,CAS本身已經提供。下面我們來看下如何配置來實現這個功能,我們還是繼續使用前面的例子作為實踐。

1. 修改deployerConfigContext.xml,找到bean id="authenticationManager" 定義區,裡面新增如下內容:

<property name="authenticationMetaDataPopulators">
  <util:list>
    <bean class="org.jasig.cas.authentication.principal.RememberMeAuthenticationMetaDataPopulator"
/> </util:list> </property>

此處的修改主要是將頁面提交的rememberMe屬性傳遞到內部生成的authentication物件中。

2. 修改登入流程檔案內容,根據上篇實踐工程,我們現在使用的是nebula-login-webflow.xml

修改credential為:

<var name="credential" class="org.jasig.cas.authentication.RememberMeUsernamePasswordCredential" />

viewLoginForm中增加rememberMe繫結變數:

<binder>
  <binding property="username" />
  <binding property="password" />
  <binding property="rememberMe" />
</binder>

此處主要是接收登入頁面的rememberMe屬性。

3.ticketExpirationPolicies.xml檔案中,註釋掉原grantingTicketExpirationPolicy,啟用新的票據過期策略:

<bean id="grantingTicketExpirationPolicy" class="org.jasig.cas.ticket.support.RememberMeDelegatingExpirationPolicy">
 <property name="sessionExpirationPolicy">
   <bean class="org.jasig.cas.ticket.support.TimeoutExpirationPolicy">
     <constructor-arg index="0" value="7200000" />
   </bean>
 </property>
 <property name="rememberMeExpirationPolicy">
  <bean class="org.jasig.cas.ticket.support.TimeoutExpirationPolicy">
    <constructor-arg index="0" value="604800000" />
  </bean>
 </property>
</bean>

上述TGT票據過期策略定義的是如果前端頁面提交時“remember me”選項沒有選中,定義的是false,執行2小時使用者沒有操作應用TGT過期策略,如果選中了免登入,7天過期。當然,可以根據情況修改上面的數字,注意單位是毫秒。

這是remember me這個功能的核心。我們知道TGT代表的是全域性會話,remember me意味著全域性會話的有效期延長,上述就是定義TGT的過期策略。

4. 最後是修改登入頁面,增加“記住我”remember me選項:

<div><input type="checkbox" name="rememberMe" id="rememberMe" checked="true" />記住我</div>

好了,做了如上修改,我們啟動工程,直接在認證中心登入,顯示的登入頁面為:
q2

登入成功後,我們關掉瀏覽器,再開啟,輸入www.cas.com,則顯示
q3
此時,記住密碼功能生效。

remember me主要涉及的是TGT的有效期問題,這裡我們再深入討論一下。TGT的有效期控制採用策略模式實現。預設是TicketGrantingTicketExpirationPolicy,即應用空閒超過2小時,TGT存在超過8小時即過期策略。CAS提供了幾種Policy,一般都能滿足我們的需求,當然我們也可以根據需要自己定義特殊的Policy策略。

TGT預設採用虛擬機器記憶體方式儲存,其生命週期由Policy控制。同時ticket的時效是被動後驗方式,在這種情況下,我們還需要一個清除器定期清除記憶體中過期的還未經過處理的ticket。這個清除器在ticketRegistry.xml中定義,叫ticketRegistryCleaner,定時任務採用spring整合的Quartz實現。

當我們採用第三方Cache工具如redis、memcached等能控制資料儲存時效的其它儲存策略實現時,這時ticketRegistryCleaner就不再需要了。但要注意,儲存資料時的有效時長要大於等於policy定義的有效時效。

我們知道,TGT的ID在客戶端TGC Cookie中,因此保持全域性會話,不僅要服務端TGT這個票據物件存在,同時TGC這個Cookie也不能過期。在ticketGrantingTicketCookieGenerator.xml中,預設情況下p:cookieMaxAge設定為-1,表示長期有效。這裡不需要修改,我們只需要服務端用policy控制TGT的有效期就可以了。