NOTE: Everything About CAS
假设 CAS Server 的域名是 cas.server.com
CAS Server 的 webapp 是 spring web flow,登陆地址为:https://cas.server.com/cas/login
登出地址为:https://cas.server.com/cas/logout
语言参数为:locale=zh_CN,locale=en
除了配置 CAS Server 和 Client 外,需要配置环境,包括生成和导出导入证书,Tomcat配置SSL等。
CAS Server
原理(认证流程)

原理:按照此图来说
用户访问CAS Client
其配置的 AuthenticationFilter 会拦截此请求,生成 service 参数,并重定向到 CAS Server 的登陆接口,url为 https://cas.server.com/login?service=redirect_url
用户在 CAS Server 输入 Credentials(一般就是用户名和密码)进行身份验证,成功后,CAS Server 会生成认证 cookie,即TGC。(另:TGC作为 cookie之外,也会换存在服务器本地,我猜测是不是服务器运行实例的内存中。)
CAS Server还会根据 service 参数,生成 Ticket,即ST。ST会保存在服务器,也会加在 url 后面,重定向回 client。url为 http://client_server_url:port/app_name?ticket=ST-*-*
Client 的 AuthenticationFilter 看到 ticket 参数后,会跳过,交由后面的 TicketValidationFilter 来处理。TicketValidationFilter 会利用 httpclient 工具访问 cas server 的 /serviceValidate 接口,将 ticket, service 传入该接口,验证 ticket 的有效性。
如果返回验证成功,就会把用户信息写入 client 的 session 里。
至此,SSO 会话就建立起来了。
结果就是:
用户在同一浏览器访问同一 client,不会去 CAS Server 认证,因为 AuthenticationFilter 会在 session 读取到用户信息。
用户在同一浏览器访问其他 client,AuthenticationFilter 在 session 里读不到用户信息,会去 cas login 接口认证,但是此时 cas login 接口会读取到存储在cas server域名下的 TGC,所以,CAS Server不会跳到登录页,只会根据 service 参数生成一个 ticket,传给 client。然后由TicketValidationFilter做一次交互验证。
CAS Server 提供的接口
cas server 一共定义了9个接口。client 会通过 url redirect 和 httpclient 的方式和 server 交互。
| 接口 | 说明 |
|---|---|
| /login | 认证接口 |
| /logout | 退出接口,销毁 TGC |
| /validate | 验证 ticket 接口,CAS1.0 |
| /serviceValidate | 同上,CAS2.0 |
| /proxy | 支持代理功能的接口 |
| /proxyValidate | 同上 |
| /CentralAuthenticationService | 用于和远程的 web services 交互 |
| /remoteLogin | 认证接口(新增) |
| /directLogin | 认证接口(新增) |
认证相关的术语
Credentials 用户提供的凭证,比如 用户名/密码,证书,IP地址,Cookie值等。
AuthenticationHandler 认证Handler,比如:AbstractUsernamePasswordAuthenticationHandler 负责处理 UsernamePasswordCredentials.
CredentialsToPrincipalResolvers 负责由 Credentials 生成 Principal 对象,每种 CredentialsToPrincipalResolvers 只处理 一种Credentials ,比如 UsernamePasswordCredentialsToPrincipalResolver 负责从 UsernamePasswordCredentials 中取出用户名,然后将其赋给生成的 SimplePrincipal 的 ID 属性。
AuthenticationMetaDataPopulators 负责将 Credentials 的一些属性赋值给 Authentication 的 attributes 属性。
Authentication Authentication是认证管理器的最终处理结果, Authentication 封装了 Principal ,认证时间,及其他一些属性(可能来自 Credentials)。
AuthenticationManager 认证管理器得到 Credentials 对象后,负责调度AuthenticationHandler 去完成认证工作,最后返回的结果是 Authentication 对象。
CentralAuthenticationService CAS 的服务类,对 Web 层提供了一些方法。该类还负责调用 AuthenticationManager 完成认证逻辑。