概念:
CAS为用户签发登录票据,CAS认证成功后,将TGT对象放入自己的缓存,CAS生成cookie即TGC,自后
登录时如果有TGC的话,则说明用户之前登录过,如果没有,则用户需要重新登录。
TGC (Ticket-granting cookie):存放用户身份认证凭证的cookie,在浏览器和CAS Server用来明确用户身份的凭证。
ST(Service Ticket):CAS服务器通过浏览器分发给客户端服务器的票据。一个特定服务只能有一个唯一的ST
安装CAS服务端
1、通过git下载
git clone -b 5.1 https://github.com/apereo/cas...
2、maven命令打war包
解压后 cd cas-overlay-template
mvn clean package
3、tomcat部署
从target下找到war放到tomcat的webapps里,启动即可
配置cas服务端
War包web-inf的application.properties文件
1、配置静态密码
原cas.authn.accept.users=casuser::Mellon改为
cas.authn.accept.users=admin::111111
2、增加授权,支持http
增加cas.tgc.secure=false
cas.serviceRegistry.initFromJson=true
关于ssl的都屏蔽
修改servicesHTTPSandIMAPS-10000001.json,修改为https|imaps|http
自有应用接入示例
基于springboot应用程序,改造原登录代码,实现cas服务端登录后当前程序不需要登录。
本例没有使用cas官方客户端,即本例仅通过跳转到cas服务端创建登录cookie。然后登录成功后返回当前的应用的固定方法,由其根据返回的TICKET通过get请求去cas服务端确认是否是正常的票据,并取的登录账号,然后根据账号进入系统。
这里业务系统的登录权限控制仍使用自带的。即只有第一次登录涉及到cas,后续所有请求不在与cas有关系。
以下是两个系统,入口地址
系统1:casapp1.com:8081/xit1/loginSsoValidate
系统2:casapp2.com:8082/xt2/loginSsoValidate
第一次在浏览器输入系统1的入口地址
由于此时在浏览器没有ca服务给写入的tgc cookie。会通过代码重定向到casserver进行登录认证。
认证成功后会根据前期提供的service地址,再回调,并给客户端生成tgc cookie。
核心程序如下:
@RequestMapping(value={"/loginSsoValidate"}
public String loginSso(HttpServletRequest request, HttpServletResponse response, Model model, LoginBean loginBean)
{
String ticket= request.getParameter("ticket");
//第一次登录,直接重定向到casserver
if(ticket==null||"".equals(ticket)){
return "redirect:"+"http://casserver.com:8080/cas/login?service=http%3a%2f%2fcasapp1.com%3a8081%2fepm%2floginSsoValidate";
}
//登录成功后回调,从server端根据票据获取登录信息。有了登录账号再去进行自己的登录授权控制。
ResponseEntity<String> resp = template.exchange(
"http://casserver.com:8080/cas/serviceValidate?service=http://casapp1.com:8081/epm/loginSsoValidate&ticket="+ticket,
HttpMethod.GET, null, String.class);
String body = resp.getBody();
Document document;
String portalname="";
try {
document = DocumentHelper.parseText(body);
Node userNode=document.selectSingleNode("//cas:user");
if(userNode!=null){
//根据节点对象获取登录账号
portalname=userNode.getText();
}else{
portalname="";
}
} catch (DocumentException e1) {
e1.printStackTrace();
}
单点登录进程分析(对应上面程序)
图片为重定向到casserver的效果
1、重定向到casserver登录界面
=============================================================
WHO: audit:unknown
WHAT: [event=success,timestamp=Thu Aug 08 15:25:30 CST 2019,source=RankedAuthenticationProviderWebflowEventResolver]
ACTION: AUTHENTICATION_EVENT_TRIGGERED
APPLICATION: CAS
WHEN: Thu Aug 08 15:25:30 CST 2019
CLIENT IP ADDRESS: 127.0.0.1
SERVER IP ADDRESS: 127.0.0.1
2、登录认证
=============================================================
WHO: admin
WHAT: Supplied credentials: [admin]
ACTION: AUTHENTICATION_SUCCESS
APPLICATION: CAS
WHEN: Thu Aug 08 15:27:50 CST 2019
CLIENT IP ADDRESS: 127.0.0.1
SERVER IP ADDRESS: 127.0.0.1
3、Tgc-cookie生成
=============================================================
WHO: admin
WHAT: TGT-**********************************************DXpPUQE1bK-lenovo-PC
ACTION: TICKET_GRANTING_TICKET_CREATED
APPLICATION: CAS
WHEN: Thu Aug 08 15:27:50 CST 2019
CLIENT IP ADDRESS: 127.0.0.1
SERVER IP ADDRESS: 127.0.0.1
4、st(tiket票据)生成
=============================================================
WHO: admin
WHAT: ST-7-asvaBsIRu1qPlNcPVbAJ-lenovo-PC for http://casapp1.com:8081/epm/loginSsoValidate
ACTION: SERVICE_TICKET_CREATED
APPLICATION: CAS
WHEN: Thu Aug 08 15:27:50 CST 2019
CLIENT IP ADDRESS: 127.0.0.1
SERVER IP ADDRESS: 127.0.0.1
=============================================================
4、st(tiket票据)验证
=============================================================
WHO: admin
WHAT: ST-7-asvaBsIRu1qPlNcPVbAJ-lenovo-PC
ACTION: SERVICE_TICKET_VALIDATED
APPLICATION: CAS
WHEN: Thu Aug 08 15:27:50 CST 2019
CLIENT IP ADDRESS: 127.0.0.1
SERVER IP ADDRESS: 127.0.0.1
单点登录到第二个系统的时候
1、重定向cas登录控制,此时发现浏览器已经存在tgc,则不需要登录
=============================================================
WHO: audit:unknown
WHAT: [event=success,timestamp=Thu Aug 08 15:31:48 CST 2019,source=InitialAuthenticationAttemptWebflowEventResolver]
ACTION: AUTHENTICATION_EVENT_TRIGGERED
APPLICATION: CAS
WHEN: Thu Aug 08 15:31:48 CST 2019
CLIENT IP ADDRESS: 127.0.0.1
SERVER IP ADDRESS: 127.0.0.1
2、st(tiket票据)生成
=============================================================
WHO: admin
WHAT: ST-8-TT6YJMhAWk22lIUyZHC5-lenovo-PC for http://casapp2.com:8082/cepm/loginSsoValidate
ACTION: SERVICE_TICKET_CREATED
APPLICATION: CAS
WHEN: Thu Aug 08 15:31:48 CST 2019
CLIENT IP ADDRESS: 127.0.0.1
SERVER IP ADDRESS: 127.0.0.1
3、st(tiket票据)验证
=============================================================
WHO: admin
WHAT: ST-8-TT6YJMhAWk22lIUyZHC5-lenovo-PC
ACTION: SERVICE_TICKET_VALIDATED
APPLICATION: CAS
WHEN: Thu Aug 08 15:31:49 CST 2019
CLIENT IP ADDRESS: 127.0.0.1
SERVER IP ADDRESS: 127.0.0.1
Tgc cookie在浏览器的情况
总结归纳
Request1
【第一步】终端第一次访问CAS—Client1,AuthenticationFilter会截获此请求:
1、首先,检测本地Session没有缓存有用户信息;
2、然后,检测到请求信息中没有ST;
3、所以,CAS—Client1将请求重定向到CAS—Server,并传递 Service (也就是要访问的目的资源地址,以便登录成功过后转回该地址),例:【https://cas:8443/cas/login?service=http0%3A8081%2F】
【第二步】终端第一次访问CAS—Server:
1、CAS—Server检测到请求信息中没有TGC,所以跳转到自己的登录页;
2、终端输入用户名、密码登录CAS—Server,认证成功后,CAS—Server会生成登录票据—TGT(集成了用户信息与ST),并随机生成一个服务票据—ST与CAS会话标识—TGC。TGT实际上就是Session,而TGC就是这标识这个Session存到Cookie中的SessionID;ST即,根据Service生成Ticket。
3、然后,CAS—Server会将Ticket加在url 后面,然后将请求redirect 回客户web 应用,例如URL为【http://192.168.1.1:8081/web1/?ticket=ST-5-Sx6eyvj7cPPCfn0pMZ】
【第三步】这时,终端携带ticket再次请求CAS—Client1:
1、这时客户端的AuthenticationFilter看到ticket 参数后,会跳过,由其后面的TicketValidationFilter 处理;
2、TicketValidationFilter 会利用httpclient工具访问cas 服务的/serviceValidate 接口, 将ticket 、service 都传到此接口,由此接口验证ticket 的有效性,即向CAS—Server验证ST的有效性。
3、TicketValidationFilter如果得到验证成功的消息,就会把用户信息写入web 应用的session里。至此为止,SSO 会话就建立起来了。
Request2
上面说了SSO 会话已经建立起来了,这时用户在同一浏览器里第二次访问此web 应用(CAS—Client1)时,AuthenticationFilter会在session 里读取到用户信息,这就代表用户已成功登录,所以就不会去CAS 认证了。
Request3
【第一步】与Request1是完全一样的,如下:终端第一次访问CAS—Client2,AuthenticationFilter会截获此请求:
1、首先,检测本地Session没有缓存有用户信息;
2、然后,检测到请求信息中没有ST;3、所以,CAS—Client1将请求重定向到CAS—Server,并传递 Service (也就是要访问的目的资源地址,以便登录成功过后转回该地址),例:【https://cas:8443/cas/login?service=http0%3A8081%2F】
【第二步】然后,终端第二次访问CAS—Server:此时,Request中会带有上次生成的TGC,然后根据TGC(SessionID)去查找是否有对应的TGT(Session),如果有,代表此用户已成功登录过,所以此时用户不必再去登录页登录(SSO的体现),而CAS—Server会直接用找到的TGT签发一个ST,然后重定向到CAS—Client2,剩下的如Request1中的【第三步】就完全一样了。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。