一、CAS 介绍
CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法,CAS 在 2004 年 12 月正式成为 JA-SIG 的一个项目。CAS 具有以下特点:
开源的企业级单点登录解决方案
CAS Server 为需要独立部署的 Web 应用
CAS Client 支持非常多的客户端(这里指单点登录系统中的各个 Web 应用),包括官方和非官方提供的 Java, .Net, PHP, Perl, Apache, uPortal, Ruby 等 CAS Client 包
方便集成第三方OpenID、oAuth等等登录,只需进行简单配置和扩展
内置RememberMe 功能,当认证会话过期后可记录上一次登录用户账户
二、原理
从结构上看,CAS 包含两个部分: CAS Server 和 CAS Client。CAS Server 需要独立部署,主要负责对用户的认证工作;CAS Client 负责处理对客户端受保护资源的访问请求,需要登录时,重定向到 CAS Server。图2 是 CAS 最基本的协议过程:
CAS Client 与受保护的客户端应用部署在一起,以 Filter 方式保护受保护的资源。对于访问受保护资源的每个 Web 请求,CAS Client 会分析该请求的 Http 请求中是否包含 Service Ticket,如果没有,则说明当前用户尚未登录,于是将请求重定向到指定好的 CAS Server 登录地址,并传递 Service (也就是要访问的目的资源地址),以便登录成功过后转回该地址。用户在第 3 步中输入认证信息,如果登录成功,CAS Server 随机产生一个相当长度、唯一、不可伪造的 Service Ticket,并缓存以待将来验证,之后系统自动重定向到 Service 所在地址,并为客户端浏览器设置一个 Ticket Granted Cookie(TGC),CAS Client 在拿到 Service 和新产生的 Ticket 过后,在第 5,6 步中与 CAS Server 进行身份合适,以确保 Service Ticket 的合法性。
在该协议中,所有与 CAS 的交互均采用 SSL 协议,确保,ST 和 TGC 的安全性。协议工作过程中会有 2 次重定向的过程,但是 CAS Client 与 CAS Server 之间进行 Ticket 验证的过程对于用户是透明的。
另外,CAS 协议中还提供了 Proxy (代理)模式,以适应更加高级、复杂的应用场景。
三、基本概念描述
Principal
Credentials:身份凭证,指在系统用用于身份验证的唯一依据
ticket
三、pom.xml 配置
配置所需 jar 包,和编译参数
<!-- springframework start -->
... ...
<dependency>
<groupId>org.springframework.webflow</groupId>
<artifactId>spring-webflow</artifactId>
</dependency>
<!-- springframework end -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- cas start -->
<dependency>
<groupId>org.jasig.cas</groupId>
<artifactId>cas-server-core</artifactId>
</dependency>
<dependency>
<groupId>org.jasig.cas</groupId>
<artifactId>cas-server-support-openid</artifactId>
</dependency>
<dependency>
<groupId>org.jasig.cas</groupId>
<artifactId>cas-server-support-oauth</artifactId>
</dependency>
<dependency>
<groupId>org.jasig.cas</groupId>
<artifactId>cas-server-integration-memcached</artifactId>
</dependency>
<dependency>
<groupId>org.jasig.cas.client</groupId>
<artifactId>cas-client-core</artifactId>
</dependency>
<!-- cas end -->
<dependency>
<groupId>org.scribe</groupId>
<artifactId>scribe-up</artifactId>
</dependency>
<dependency>
<groupId>com.buession</groupId>
<artifactId>cas-server-support</artifactId>
</dependency>
<dependency>
<groupId>com.buession</groupId>
<artifactId>open</artifactId>
</dependency>
<dependency>
<groupId>com.buession</groupId>
<artifactId>oauth-client</artifactId>
</dependency>
<dependency>
<groupId>com.buession</groupId>
<artifactId>mcrypt</artifactId>
</dependency>
四、com.buession jar 包说明
cas-server-support
cas server 的补充,重写了部分 cas server APIgit clone git@github.com:eduosi/cas-server-support.git
open
git clone git@github.com:eduosi/open.git
oauth-client
scribe-up 的扩展,增加了 Weibo、QQ、Alipay Provider
git clone git@github.com:eduosi/oauth-client.git
mcrypt:
对象加密工具,支持除 null 以外的且能转换字符串的任意对象多次加密git clone git@github.com:eduosi/Mcrypt.git
五、properties 文件加载
修改 WEB-INF/spring-configuration/propertyFileConfigurer.xml
<bean id="propertyPlaceholderConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
p:location="/WEB-INF/cas.properties" />
为
<bean id="propertyPlaceholderConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
... ...
</list>
</property>
<property name="ignoreResourceNotFound" value="true" />
</bean>
定义不同环境的 properties 文件