CAS使用账号密码实现单点登陆
CAS单点登陆框架
CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法
官方网站
https://www.apereo.org/projects/cas
这里不详细介绍CAS的单点登陆原理,感兴趣的同学可以自己去研究一下,这里仅就项目中遇到的问题进行记录
项目需求
我们的系统通过单点登陆跳转到另一个系统,我们的系统使用的是Spring Security做用户验证,另一个系统使用的CAS单点登陆框架进行验证,两套系统用户没有任何关系,
对方系统仅提供了一个用户名和密码,所以我们需要通过用户名密码进行CAS登陆验证
实现思路
使用CAS的Restful API进行实现(需要CAS服务端配置REST API启用才可以,我没有找到使用CAS Client直接进行用户名密码验证的方法,有知道方法的大神可以指教一下)
1、使用用户名密码获取TGT
-
api: http://127.0.0.1:8080/cas/v1/tickets
-
method: post
-
RequestHeader:
- Content-type: application/x-www-form-urlencoded
-
Requestbody:
- username: user1
- password: pwd
-
ResponseBody:
(这个可能与CAS服务端的配置或版本有关系,我也只是猜测,我调用的三方厂家服务的API只能获取到html格式的返回值,即使在Header里设置了Accept = application/json)
<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">
<html>
<head>
<title>201 Created</title>
</head>
<body>
<h1>TGT Created</h1>
<form action="http://127.0.0.1/cas/v1/tickets/TGT-2974-4Mki7nXCTz7Q9mQ9CZRbjF9k9WaZCc9bwR42VR46aMchxmS24r" method="POST">Service:
<input type="text" name="service" value="">
<br>
<input type="submit" value="Submit">
</form>
</body>
</html>
返回的消息中,对我们有用的数据为http://127.0.0.1/cas/v1/tickets/TGT-2974-4Mki7nXCTz7Q9mQ9CZRbjF9k9WaZCc9bwR42VR46aMchxmS24r,这样我们就获得了TGT
2、根据TGT和Service获取ST
TGT是上一步中获取的返回值,service是指我们需要访问的服务地址,如果只做测试的话可以直接写www.baidu.com也可以,不过为了测试最终获取的ST的有效性,最好还是让三方厂家提供一个他们的使用CAS验证的服务
- api: http://127.0.0.1/cas/v1/tickets/TGT-2974-4Mki7nXCTz7Q9mQ9CZRbjF9k9WaZCc9bwR42VR46aMchxmS24r
就是上一步中获取到的TGT
- method: post
- RequestHeader:
- Content-type: application/x-www-form-urlencoded
- Requestbody:
- service: http://www.baidu.com
- ResponseBody:
- ST-4674-nPDWMzyeysgGJFXTYC7J-radar
返回的消息只有一个text文本,我猜测可能也跟CAS服务端的配置或版本有关
3、使用ST访问目标资源
- url: http://www.b