CAS ticket过期策略
介绍
CAS
CAS 是Yale(耶鲁)大学的一个开源的企业级单点登录系统,它的特点:
- Java (Spring Webflow/Spring Boot) 服务组件
- 可插拔身份验证支持(LDAP,Database,X.509,MFA)
- 支持多种协议(CAS,SAML,OAuth,OpenID,OIDC)
- 跨平台客户端支持(Java,.Net,PHP,Perl,Apache等)
- 与uPortal,Liferay,BlueSocket,Moodle,Google Apps等集成
认证原理:如果系统发现没有通过CAS认证的话,会重定向到CAS认证,CAS认证通过之后,会把COOKIE的信息写入到auth_cas.conf中配置的CASCookiePath目录里,然后再代理到相应的地址,同时增加名为REMOTE_USER的header,应用里边只需要通过这个header找到相应的用户,让相应的用户登录即可
为什么会记录这篇文章,因为我们学校网站的就是用的这套系统,APACHE的的MOD_AUTH_CAS模块,讲道理,这个认证系统真心牛,单点登录机制,在多个应用系统中,只需要登录一次,金智教育的网页学习平台上获取的tickets在今日校园APP上也可以使用,看了一下APP的简介,果不其然 也是金智教育出品。重点在这里,在学校网站上登录后抓到的ticket也可以登录今日校园APP
CAS提供可扩展的ticket过期策略,支持ticket-granting tickets (TGT)和service tickets (ST)的配置。
CAS客户端存储用户信息一般使用session,因此客户端用户登录过期时间应该还取决于客户端session的过期时间。
一、TGT的过期策略
1、TimeoutExpirationPolicy
CAS默认使用该策略作为TGT的过期策略,该策略与session的过期策略类似,超过设定的时间需要用户重新登录获取认证票据。
该策略支持参数
- timeToKillInMilliSeconds:最大空闲时间(用户处于不活动状态),以毫秒为单位
配置示例,设置过期时间为2小时:
<bean id="grantingTicketExpirationPolicy"
    class="org.jasig.cas.ticket.support.TimeoutExpirationPolicy">
    <constructor-arg
        index="0"
        value="7200000" />
</bean>
2、HardTimeoutExpirationPolicy
该策略设置认证票据的有效时间段,无论用户是否处于不活动状态,认证票据都会过期。
该策略支持参数
- timeToKillInMilliSeconds:最大空闲时间(用户处于不活动状态),以毫秒为单位
配置示例,设置过期时间为2小时:
<bean id="grantingTicketExpirationPolicy"
    class="org.jasig.cas.ticket.support.HardTimeoutExpirationPolicy">
    <constructor-arg
        index="0"
        value="7200000" />
</bean>
3、ThrottledUseAndTimeoutExpirationPolicy
该策略集成自TimeoutExpirationPolicy,可以配置每个票据每隔一段时间要被使用一次。可以防止恶意攻击和误配置引发的瞬时大量ST票据请求导致CAS服务器崩溃。
该策略支持参数
- timeToKillInMilliSeconds:最大空闲时间(用户处于不活动状态),以毫秒为单位
- timeInBetweenUsesInMilliSeconds:连续使用票据的最小时间,以毫秒为单位
配置示例,设置过期时间为3小时,连续使用票据的最小时间设置为5秒:
<bean id="grantingTicketExpirationPolicy"
    class="org.jasig.cas.ticket.support.ThrottledUseAndTimeoutExpirationPolicy"
    p:timeToKillInMilliSeconds="10800000"
    p:timeInBetweenUsesInMilliSeconds="5000"
/>
4、NeverExpiresExpirationPolicy
认证票据永不过期。配置示例如下:
<bean id="grantingTicketExpirationPolicy" class="org.jasig.cas.ticket.support.NeverExpiresExpirationPolicy" />
5、RememberMeDelegatingExpirationPolicy
登录时可以设置记住用户,用户下次访问CAS时不需要再次登录。该策略在CAS 3.2.1之后的版本才支持,需要配置如下:
1)AuthenticationManager需要增加AuthenticationMetaDataPopulator的配置
<property name="authenticationMetaDataPopulators">
    <list>
        <bean class="org.jasig.cas.authentication.principal.RememberMeAuthenticationMetaDataPopulator" />
    </list>
</property>
2)修改登录流程
login-webflow.xml
定位credentials var节点,原始配置如下:
<var name="credentials" class="org.jasig.cas.authentication.principal.UsernamePasswordCredentials" />
将其修改为:
<var name="credentials" class="org.jasig.cas.authentication.principal.RememberMeUsernamePasswordCredentials" />
定位viewLoginForm bean,原始配置可能是:
[ ](javascript:void(0)😉
](javascript:void(0)😉
<view-state id="viewLoginForm" view="casLoginView" model="credentials">
      <binder>
          <binding property="username" />
          <binding property="password" />
      </binder>
      <on-entry>
          <set name="viewScope.commandName" value="'credentials'" />
      </on-entry>
    <transition on="submit" bind="true" validate="true" to="realSubmit">
          <evaluate expression="authenticationViaFormAction.doBind(flowRequestContext, flowScope.credentials)" />
      </transition>
</view-state>
[ ](javascript:void(0)😉
](javascript:void(0)😉
修改为:
[ ](javascript:void(0)😉
](javascript:void(0)😉
<view-state id="viewLoginForm" view="casLoginView" model="credentials">
    <binder>
        <binding property="username" />
        <binding property="password" />
        <binding property="rememberMe" />
    </binder>
    <on-entry>
        <set name="viewScope.commandName" value="'credentials'" />
    </on-entry>
    <transition on="submit" bind="true" validate="true" to="realSubmit">
        <evaluate expression="authenticationViaFormAction.doBind(flowRequestContext, flowScope.credentials)" />
    </transition>
</view-state>
[ ](javascript:void(0)😉
](javascript:void(0)😉
3)修改ticket过期策略
ticketExpirationPolicies.xml
[ ](javascript:void(0)😉
](javascript:void(0)😉
<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="XXXXXXXX" />
    </bean>
   </property>
   <property name="rememberMeExpirationPolicy">
    <bean class="org.jasig.cas.ticket.support.TimeoutExpirationPolicy">
           <constructor-arg index="0" value="XXXXXXXX" />
    </bean>
   </property>
</bean>
[ ](javascript:void(0)😉
](javascript:void(0)😉
二、ST的过期策略
MultiTimeUseOrTimeoutExpirationPolicy:默认策略,可以设置用户空闲时间最大值或票证使用次数最大值。
该策略支持参数
- numberOfUses:票证最大使用次数,超过此次数,ST将过期
- timeToKillInMilliSeconds:最大空闲时间(用户处于不活动状态),以毫秒为单位
配置示例,设置过期时间为5分钟,票据只允许使用一次:
[ ](javascript:void(0)😉
](javascript:void(0)😉
<bean id="serviceTicketExpirationPolicy"
    class="org.jasig.cas.ticket.support.MultiTimeUseOrTimeoutExpirationPolicy">
    <constructor-arg
        index="0"
        value="1" />
    <constructor-arg
        index="1"
        value="300000" />
</bean>
[ ](javascript:void(0)😉
](javascript:void(0)😉

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号