单点登录CAS9-服务端RememberMe

CAS一些配置项

下面是CAS-4.0.3服务端的来自cas.properties中的一些配置项介绍

1、cas.securityContext.status.allowedSubnet=127.0.0.1

  可以访问的服务端统计页面:http://sso.jadyer.com:8080/cas-server-web/status

  可以访问的服务端统计页面:http://sso.jadyer.com:8080/cas-server-web/statistics

2、host.name=S3

  uniqueIdGenerators.xml中的各种UniqueTicketIdGenerator生成TGT/ST等ticket时会用到host.name作为ticket的后缀

  host.name通常用在集群环境下,其值对于每个节点来说都必须是唯一的,这样整个集群环境生成的各种ticket也必定是唯一的

  单机环境下就没必要修改它了

3、slo.callbacks.disabled=false:是否禁用单点登出

4、cas.logout.followServiceRedirects=true:是否允许客户端Logout后重定向到service参数指定的资源

5、tgt.maxTimeToLiveInSeconds=28800:指定Session的最大有效时间,即从生成到指定时间后便超时,默认28800s,即8小时

6、tgt.timeToKillInSeconds=7200

  指定用户操作的超时时间,即用户在多久不操作后就超时,默认7200s,即2小时

  经本人亲测:在测试tgt.timeToKillInSeconds时还要注意客户端web.xml配置的超时时间

  即只有客户端配置超时时间不大于tgt.timeToKillInSeconds时才能看见服务端设置的效果

7、st.timeToKillInSeconds=10

  指定ServiceTicket的有效时间,默认10s

  这也是debug追踪CAS应用认证过程中经常会失败的原因,因为追踪的时候ServiceTicket已经过了10秒有效期了

RememberMe原理

RememberMe也就是记住密码,可以让用户登录成功后,关闭浏览器再重新打开浏览器访问应用时不需要再次登录

实现方式可参考官方文档,网址如下(下面两个网址描述的都是一样的,只是第二个额外还有其它描述)

http://jasig.github.io/cas/development/installation/Configuring-LongTerm-Authentication.html

http://jasig.github.io/cas/4.0.x/installation/Configuring-Authentication-Components.html#long-term-authentication

具体修改步骤如下

1、cas.properties中新增配置项rememberMeDuration=1209600

2、ticketExpirationPolicies.xml中新增RememberMe过期策略的配置

3、ticketGrantingTicketCookieGenerator.xml中新增属性项p:rememberMeMaxAge=”${rememberMeDuration:1209600}”

4、deployerConfigContext.xml

5、casLoginView.jsp表单中增加rememberMe字段

6、login-webflow.xml增加接收表单rememberMe字段的配置

7、UsernamePasswordCaptchaCredential.java集成RememberMeUsernamePasswordCredential使得可以接收表单的rememberMe字段

代码

本文源码下载:(下面两个地址的文件的内容,都是一样的,并包含了本系列的所有代码)

http://oirr30q6q.bkt.clouddn.com/jadyer/code/sso-cas-remember-me.rar

http://download.csdn.net/detail/jadyer/8940967

下面是ticketExpirationPolicies.xml的修改

[html] view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!--  
  3.   
  4.     Licensed to Jasig under one or more contributor license  
  5.     agreements. See the NOTICE file distributed with this work  
  6.     for additional information regarding copyright ownership.  
  7.     Jasig licenses this file to you under the Apache License,  
  8.     Version 2.0 (the "License"); you may not use this file  
  9.     except in compliance with the License.  You may obtain a  
  10.     copy of the License at the following location:  
  11.   
  12.       http://www.apache.org/licenses/LICENSE-2.0  
  13.   
  14.     Unless required by applicable law or agreed to in writing,  
  15.     software distributed under the License is distributed on an  
  16.     "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY  
  17.     KIND, either express or implied.  See the License for the  
  18.     specific language governing permissions and limitations  
  19.     under the License.  
  20.   
  21. -->  
  22. <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:c="http://www.springframework.org/schema/c" xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">  
  23.     <description>  
  24.         Assignment of expiration policies for the different tickets generated by CAS including ticket granting ticket  
  25.         (TGT), service ticket (ST), proxy granting ticket (PGT), and proxy ticket (PT).  
  26.         These expiration policies determine how long the ticket they are assigned to can be used and even how often they  
  27.         can be used before becoming expired / invalid.  
  28.     </description>  
  29.   
  30.     <!-- Expiration policies -->  
  31.     <util:constant id="SECONDS" static-field="java.util.concurrent.TimeUnit.SECONDS"/>  
  32.     <bean id="serviceTicketExpirationPolicy" class="org.jasig.cas.ticket.support.MultiTimeUseOrTimeoutExpirationPolicy"  
  33.           c:numberOfUses="1" c:timeToKill="${st.timeToKillInSeconds:10}" c:timeUnit-ref="SECONDS"/>  
  34.   
  35.     <!-- TicketGrantingTicketExpirationPolicy: Default as of 3.5 -->  
  36.     <!-- Provides both idle and hard timeouts, for instance 2 hour sliding window with an 8 hour max lifetime -->  
  37.     <!--  
  38.     <bean id="grantingTicketExpirationPolicy" class="org.jasig.cas.ticket.support.TicketGrantingTicketExpirationPolicy"  
  39.           p:maxTimeToLiveInSeconds="${tgt.maxTimeToLiveInSeconds:28800}"  
  40.           p:timeToKillInSeconds="${tgt.timeToKillInSeconds:7200}"/>  
  41.      -->  
  42.   
  43.     <!-- 以下为RememberMe所需配置 -->  
  44.     <!-- 这里要先把原有的<bean id="grantingTicketExpirationPolicy">注释掉,如上所示 -->  
  45.     <!-- 之所以注释是因为applicationContext.xml的第117行要用到<bean id="grantingTicketExpirationPolicy"> -->  
  46.     <!-- 而我们实现RememberMe需要用到的是RememberMeDelegatingExpirationPolicy,而非默认的TicketGrantingTicketExpirationPolicy -->  
  47.     <!-- 看看下面的配置就一目了然了 -->  
  48.     <!--  
  49.         | The following policy applies to standard CAS SSO sessions.  
  50.         | Default 2h (7200s) sliding expiration with default 8h (28800s) maximum lifetime.  
  51.     -->  
  52.     <bean id="standardSessionTGTExpirationPolicy" class="org.jasig.cas.ticket.support.TicketGrantingTicketExpirationPolicy"  
  53.           p:maxTimeToLiveInSeconds="${tgt.maxTimeToLiveInSeconds:28800}"  
  54.           p:timeToKillInSeconds="${tgt.timeToKillInSeconds:7200}"/>  
  55.     <!--  
  56.         | The following policy applies to long term CAS SSO sessions.  
  57.         | Default duration is two weeks (1209600s).  
  58.     -->  
  59.     <bean id="longTermSessionTGTExpirationPolicy" class="org.jasig.cas.ticket.support.TimeoutExpirationPolicy"  
  60.           c:timeToKillInMilliSeconds="#{ ${rememberMeDuration:1209600} * 1000 }"/>  
  61.     <bean id="grantingTicketExpirationPolicy" class="org.jasig.cas.ticket.support.RememberMeDelegatingExpirationPolicy"  
  62.           p:sessionExpirationPolicy-ref="standardSessionTGTExpirationPolicy"  
  63.           p:rememberMeExpirationPolicy-ref="longTermSessionTGTExpirationPolicy"/>  
  64. </beans>  


下面是cas.properties中增加的rememberMeDuration配置

[html] view plain copy
  1. # Long term authentication session length in seconds  
  2. #服务端RememberMe的有效期,默认为1209600s,即两周  
  3. rememberMeDuration=1209600  

下面是ticketGrantingTicketCookieGenerator.xml的修改

[html] view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">  
  3.     <description>  
  4.         Defines the cookie that stores the TicketGrantingTicket.  You most likely should never modify these (especially the "secure" property).  
  5.         You can change the name if you want to make it harder for people to guess.  
  6.     </description>  
  7.   
  8.     <!-- 针对RememberMe需增加p:rememberMeMaxAge属性配置 -->  
  9.     <bean id="ticketGrantingTicketCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"  
  10.         p:cookieSecure="false"  
  11.         p:cookieMaxAge="-1"  
  12.         p:rememberMeMaxAge="${rememberMeDuration:1209600}"  
  13.         p:cookieName="CASTGC"  
  14.         p:cookiePath="/cas" />  
  15. </beans>  

下面是deployerConfigContext.xml修改的部分

[html] view plain copy
  1. <bean id="authenticationManager" class="org.jasig.cas.authentication.PolicyBasedAuthenticationManager">  
  2.     <constructor-arg>  
  3.         <map>  
  4.             <entry key-ref="proxyAuthenticationHandler" value-ref="proxyPrincipalResolver" />  
  5.             <entry key-ref="primaryAuthenticationHandler" value-ref="primaryPrincipalResolver" />  
  6.         </map>  
  7.     </constructor-arg>  
  8.   
  9.     <property name="authenticationPolicy">  
  10.         <bean class="org.jasig.cas.authentication.AnyAuthenticationPolicy" />  
  11.     </property>  
  12.   
  13.     <!-- 针对RememberMe需增加的属性配置 -->  
  14.     <property name="authenticationMetaDataPopulators">  
  15.         <list>  
  16.             <bean class="org.jasig.cas.authentication.SuccessfulHandlerMetaDataPopulator"/>  
  17.             <bean class="org.jasig.cas.authentication.principal.RememberMeAuthenticationMetaDataPopulator"/>  
  18.         </list>  
  19.     </property>  
  20. </bean>  

下面是login-webflow.xml修改的部分

[html] view plain copy
  1. <view-state id="viewLoginForm" view="casLoginView" model="credential">  
  2.        <binder>  
  3.            <binding property="username"/>  
  4.            <binding property="password"/>  
  5.            <!-- 前台表单添加验证码字段captcha -->  
  6.            <binding property="captcha"/>  
  7.            <!-- 前台表单添加RememberMe字段 -->  
  8.            <binding property="rememberMe"/>  
  9.        </binder>  
  10.        <on-entry>  
  11.            <set name="viewScope.commandName" value="'credential'" />  
  12.        </on-entry>  
  13.     <transition on="submit" bind="true" validate="true" to="validateCaptcha">  
  14.            <evaluate expression="authenticationViaCaptchaFormAction.doBind(flowRequestContext, flowScope.credential)" />  
  15.        </transition>  
  16. </view-state>  

下面是UsernamePasswordCaptchaCredential.java

[html] view plain copy
  1. package com.jadyer.sso.model;  
  2. import org.jasig.cas.authentication.RememberMeUsernamePasswordCredential;  
  3.   
  4. /**  
  5.  * 自定义的接收登录验证码的实体类  
  6.  * Created by 玄玉<https://jadyer.github.io/> on 2015/07/14 16:28.  
  7.  */  
  8. //public class UsernamePasswordCaptchaCredential extends UsernamePasswordCredential {  
  9. public class UsernamePasswordCaptchaCredential extends RememberMeUsernamePasswordCredential {  
  10.     private static final long serialVersionUID = 8317889802836113837L;  
  11.     private String captcha;  
  12.     /*-- setter和getter略 --*/  
  13. }  

最后是/WEB-INF/view/jsp/jadyer/ui/casLoginView.jsp

[html] view plain copy
  1. <%@ page pageEncoding="UTF-8"%>  
  2. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>  
  3. <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>  
  4.   
  5. <c:set var="ctx" value="${pageContext.request.contextPath}" scope="session"/>  
  6.   
  7. <!DOCTYPE HTML>  
  8. <html>  
  9. <head>  
  10.     <meta charset="UTF-8"/>  
  11.     <title>CAS单点登录系统</title>  
  12.     <link rel="icon" type="image/x-icon" href="${ctx}/favicon.ico"/>  
  13.     <script type="text/javascript" src="${ctx}/js/jquery-1.10.2.min.js"></script>  
  14.     <script type="text/javascript" src="${ctx}/js/jquery-ui-1.10.2.min.js"></script>  
  15.     <script type="text/javascript" src="${ctx}/js/cas.js"></script>  
  16.     <!--[if lt IE 9]>  
  17.         <script src="${ctx}/js/html5shiv-3.7.2.min.js" type="text/javascript"></script>  
  18.     <![endif]-->  
  19. </head>  
  20.   
  21. <style>  
  22. body {background-color: #CBE0C9;}  
  23. #msg {padding:20px; margin-bottom:10px;}  
  24. #msg.errors {border:1px dotted #BB0000; color:#BB0000; padding-left:100px; background:url(${ctx}/images/error.gif) no-repeat 20px center;}  
  25. </style>  
  26.   
  27. <body>  
  28. <c:if test="${not pageContext.request.secure}">  
  29.     <div id="msg" class="errors">  
  30.         <h2>Non-secure Connection</h2>  
  31.         <p>You are currently accessing CAS over a non-secure connection.  Single Sign On WILL NOT WORK.  In order to have single sign on work, you MUST log in over HTTPS.</p>  
  32.     </div>  
  33. </c:if>  
  34. <form:form method="post" commandName="${commandName}" htmlEscape="true">  
  35.     <!--  
  36.     cssClass用于指定表单元素CSS样式名,相当于HTML元素的class属性  
  37.     cssStyle用于指定表单元素样式,相当于HTML元素的style属性  
  38.     cssErrorClass用于指定表单元素发生错误时对应的样式  
  39.     path属性用于绑定表单对象的属性值,它支持级联属性,比如path="user.userName"将调用表单对象getUser.getUserName()绑定表单对象的属性值  
  40.      -->  
  41.     <form:errors path="*" id="msg" cssClass="errors" element="div" htmlEscape="false"/>  
  42.     <input type="hidden" name="lt" value="${loginTicket}"/>  
  43.     <input type="hidden" name="execution" value="${flowExecutionKey}"/>  
  44.     <input type="hidden" name="_eventId" value="submit"/>  
  45.     <table border="9">  
  46.         <tr>  
  47.             <td>  
  48.                 <c:if test="${not empty sessionScope.openIdLocalId}">  
  49.                     <strong>${sessionScope.openIdLocalId}</strong>  
  50.                     <input type="hidden" name="username" value="${sessionScope.openIdLocalId}"/>  
  51.                 </c:if>  
  52.                 <c:if test="${empty sessionScope.openIdLocalId}">  
  53.                     <form:input tabindex="1" path="username" placeholder="帐号" htmlEscape="true" maxlength="16" size="25"/>  
  54.                 </c:if>  
  55.             </td>  
  56.         </tr>  
  57.         <tr>  
  58.             <td>  
  59.                 <form:password tabindex="2" path="password" placeholder="密码" htmlEscape="true" maxlength="16" size="25"/>  
  60.             </td>  
  61.         </tr>  
  62.         <tr>  
  63.             <td>  
  64.                 <form:input tabindex="3" path="captcha" placeholder="验证码" htmlEscape="true" maxlength="4" size="15"/>  
  65.                 <img style="cursor:pointer; vertical-align:middle;" src="captcha.jsp" onClick="this.src='captcha.jsp?time'+Math.random();">  
  66.             </td>  
  67.         </tr>  
  68.         <tr>  
  69.             <td>  
  70.                 <input type="checkbox" tabindex="4" name="rememberMe" value="true"/>  
  71.                 <label for="warn">RememberMe</label>  
  72.             </td>  
  73.         </tr>  
  74.         <!--  
  75.         <tr>  
  76.             <td>  
  77.                 <input type="checkbox" tabindex="3" name="warn" value="true"/>  
  78.                 <label for="warn">转向其他站点前提示我</label>  
  79.             </td>  
  80.         </tr>  
  81.         -->  
  82.         <tr>  
  83.             <td>  
  84.                 <input type="submit" tabindex="5" value="登录"/>  
  85.             </td>  
  86.         </tr>  
  87.     </table>  
  88. </form:form>  
  89. </body>  
  90. </html>  
阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭