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>
好了,做了如上修改,我们启动工程,直接在认证中心登录,显示的登录页面为:
登录成功后,我们关掉浏览器,再打开,输入www.cas.com,则显示
此时,记住密码功能生效。
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的有效期就可以了。