CAS的搭建及认证流程分析与比较
CAS 简介
CAS是一个单点登录(Single Sign On,简称SSO,SSO使得在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统)框架,开始是由耶鲁大学的一个组织开发,后来归到apereo去管。
CAS Server搭建
在此下载:https://github.com/apereo/cas/tree/4.1.x
通常来说用mvn编译cas-server-webapp后放到tomcat中就行,但是cas默认需要走https,否则在登陆流程和跳转webapp流程中会出现如下两种报错。
第一种解决办法是生成一个自签名的ssl证书并在tomcat的server.xml中配置。
1 | keytool -genkey -alias tomcat -keyalg RSA -keystore /path/to/my/keystore |
1 | <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" |
但是这种方法影响wireshark后续抓包分析,并且默认情况下CAS要求webapp也是https。
第二种办法是修改cas配置使其允许http。有下面四步。
在
p:httpClient-ref="supportsTrustStoreSslSocketFactoryHttpClient"
后增加p:requireSecure="false"
修改WEB-INF/spring-configuration/ticketGrantingTicketCookieGenerator.xml
- 修改WEB-INF/spring-configuration/warnCookieGenerator.xml
- 修改注册服务WEB-INF/classes/services/HTTPSandIMAPS-10000001.json将
"serviceId" : "^(https|imaps)://.*"
修改为"serviceId" : "^(https|http|imaps)://.*"
修改重启后虽然前端还是会爆错,但是其实正常登陆了。默认的帐密是casuser/Mellon,记录在deployerConfigContext.xml中。
Webapp搭建
在此下载:https://github.com/UniconLabs/cas-sample-java-webapp
修改web.xml中casServerLoginUrl、casServerUrlPrefix、serverName值。casServerLoginUrl对应cas server地址(如果来客没有登陆过webapp就会把来客重定向到这里进行cas统一认证),casServerUrlPrefix对应cas server地址(这个值后续会跟一些api路径做拼接),serverName是webapp地址。
认证流程分析
环境ip说明
cas server:172.16.247.1
cas webapp:172.16.247.139
用户:172.16.247.131
- user访问webapp,因为之前从未登陆过webapp,所以webapp会把user重定向给cas进行统一登陆(重定向的url的serivce中带有webapp自己的url好让cas知道user登陆成功后该重定向回哪里)。
- user在cas登陆,登陆成功后cas会给user带一个cookie(TGC也叫TGT,如果之后要登陆其他webapp就不用重复输入密码而是直接给ST了)和一个ST(在location url中)的302回webapp。
- webapp拿到user请求过来的ST会向CAS的api发送已验证ST的合法性,如果cas验证成功会发送给CAS的是成功的状态信息和用户的一些数据。
- webapp从cas那里得知ST是有效的,给user设置cookie(用户之后就不必再走一次这个流程了)。并让用户成功登陆。
一图胜千言,图片来自网络(侵删)。
SSO vs Kerberos vs OAuth
当时看完整个cas的认证流程感觉里面一些要素和kerberos和OAuth认证很相似(都有一个第三方来进行认证/授权)。因此相比较一下这三者的区别。
SSO vs Kerberos
sso和kerberos和共同点在他们都一个用TGT换ST的过程,不同点在于kerberos中其实有四个角色(client,KDC-AS,KDC-TS,server)并且因为“相近”的两个之间预先共享密钥,所以server不需要发送请求向KDC求证ST的真实性,但是CAS中server需要向cas server求证真实性。
SSO vs OAuth
它俩之前最大的不同的在业务场景的不同,SSO用在一个公司内部员工的单点登陆。OAuth用在两个公司之前A公司获取其用户在B公司的一些数据。OAuth还常常涉及到啊AB两公司的帐号绑定,所以需要state来防止csrf,这个是SSO里面没有的。
杂
编译整个cas的遇到org.samba.jcifs:jcifs-ext:0.9.4无法下载的问题,选择手动下载jar并安装到本地maven仓库中。
1 | #下载地址:http://maven.yonyoucloud.com/nexus/content/groups/public/org/samba/jcifs/jcifs-ext/0.9.4/ |
参考
cas 4.1.4单点登录实战
CAS 4.1.10关闭HTTPS
使用maven命令安装jar包到本地maven仓库
Spring P标签的使用
CAS的搭建及认证流程分析与比较