介绍
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)😉
<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)😉
<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)😉
3)修改ticket过期策略
ticketExpirationPolicies.xml
[](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)😉
二、ST的过期策略
MultiTimeUseOrTimeoutExpirationPolicy:默认策略,可以设置用户空闲时间最大值或票证使用次数最大值。
该策略支持参数
- numberOfUses:票证最大使用次数,超过此次数,ST将过期
- timeToKillInMilliSeconds:最大空闲时间(用户处于不活动状态),以毫秒为单位
配置示例,设置过期时间为5分钟,票据只允许使用一次:
[](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)😉