SSO 单点登录:
单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。
我们目前的系统存在诸多子系统,而这些子系统是分别部署在不同的服务器中,那么使用传统方式的session是无法解决的,我们需要使用相关的单点登录技术来解决。
CAS 认证服务中心
CAS(Central Authentication Service)单点登录,包含两个部分: CAS Server 和 CAS Client。CAS Server 需要独立部署,主要负责对用户的认证工作;CAS Client 负责处理对客户端受保护资源的访问请求,需要登录时,重定向到 CAS Server。
下图是 CAS 最基本的协议过程:
SSO单点登录访问流程
1. 访问服务:SSO客户端发送请求访问应用系统提供的服务资源。
2. 定向认证:SSO客户端会重定向用户请求到SSO服务器。
3. 用户认证:用户身份认证。
4. 发放票据:SSO服务器会产生一个随机的Service Ticket。
5. 验证票据:SSO服务器验证票据Service Ticket的合法性,验证通过后,允许客户端访问服务。
6. 传输用户信息:SSO服务器验证票据通过后,传输用户认证结果信息给客户端。
通俗理解
Center:CAS 认证中心
A:某应用服务
B:另一个应用服务
Ticket Granted Ticket ( TGT ):全局票
Ticket Granted Cookie ( TGC ): 存放 TGT id 的 cookie
Service Ticket ( ST ):某个服务的票据
用户访问 A
A:登录了吗(cookie 中的 SessionId),没有,有票吗(ST),没有,那去 Center 吧(携带了的url,一会还得回来呢)
Center:有全局票吗(TGC 中的 TGT id,不是 SessionId),没有,那你登录吧。。。
Center:登录成功,创建TGT,并将 TGT 的 id 写到用户的 cookie(TGC)中,同时生成一个随机的 ST 让用户重定向到 A 的 url
A:登录了吗(cookie 中的 SessionId),没有,有票吗(ST),有,A去 Center 验证 ST 有效性,有效,创建 Session,并将 SessionId 写到用户 cookie 里,用户以后就用该 SessionId 与 A 进行通信
用户访问 B
B:登录了吗(cookie 中的 SessionId),没有,有票吗(ST),没有,那去 Center 吧(携带B的url,一会还得回来呢)
Center:有全局票吗(TGC 中的 TGT id,不是 SessionId),有
Center:生成一个随机的 ST 让用户重定向到 B 的 url
B:登录了吗(cookie 中的 SessionId),没有,有票吗(ST),有,B 去 Center 验证 ST 有效性,有效,创建 Session,并将 SessionId 写到用户 cookie 里,用户以后就用该 SessionId 与 B 进行通信
用户登出 A
A 删除Session 并清除用户的 Cookie 中的 SessionId
A 通知 Center 用户登出了
Center 删除 TGT 并清除用户的 TGC(存放 TGT id 的 cookie)
Center 通知所有该用户访问的应用
各个应用删除Session 并清除用户的 Cookie 中的 SessionId
实战演练 以CAS 5.2.4版本为例
证书 - https必备
生成证书
#生成证书保存到D盘的keystore
keytool -genkey -alias tomcat -keyalg RSA -keystore D:/keystore
#生成证书的时候,记住cas的域名必须保持一致
导出证书
#导出证书tomcat.cer,证书生成在 D盘
keytool -export -trustcacerts -alias tomcat -file D:/tomcat.cer -keystore D:/keystore
导入证书到jdk
keytool -import -trustcacerts -alias tomcat -file D:/tomcat.cer -keystore "C:/Program Files/Java/jdk1.8.0_162/jre/lib/security/cacerts"
# 输入密码报错 keytool 错误: java.io.IOException: Keystore was tampered with, or password was incorrect
注意 这里不是证书的密码,而是jdk的默认保护密码 :changeit
#信任证书后报错 keytool 错误: java.io.FileNotFoundException: C:\Program Files\Java\jdk1.8.0_162\jre\lib\security\cacerts (拒绝访问。)
注意 这里需要以管理员的方式运行
查看证书
#查看jdk目录下的证书
keytool -list -v -keystore "C:/Program Files/Java/jdk1.8.0_162/jre/lib/security/cacerts"
编译war包
1、官网下载项目
https://github.com/apereo/cas-overlay-template
2、导入maven项目 到myeclipse
3、修改pom.xml
比如 cas版本修改为:<cas.version>5.2.x</cas.version>
离线下载cas-server-webapp-tomcat.war文件
https://oss.sonatype.org/content/repositories/releases/org/apereo/cas/cas-server-webapp-tomcat/
4、编译并查看war包
Run As -> maven install
生成的war包:target->cas.war
配置Tomcat
1、拷贝war包到tomcat的webapp目录
注意:tomcat版本低于8.0是启动不起来的
2、配置server.xml 这里配置为8443端口
<Connector port="8443" protocol="HTTP/1.1"
minSpareThreads="5" maxSpareThreads="75"
enableLookups="true" disableUploadTimeout="true"
acceptCount="100" maxThreads="200"
scheme="https" secure="true" SSLEnabled="true"
clientAuth="false" sslProtocol="TLS"
keystoreFile="D:/keystore"
keystorePass="123456"/>
3、启动,并登录web验证
https://127.0.0.1:8443/cas/login
默认账号:casuser
默认密码:Mellon
目前的配置仅有这一个用户
CAS服务端部署
https://segmentfault.com/a/1190000013844049
官方文档:https://apereo.github.io/cas/5.2.x/index.html
官方下载:https://github.com/apereo
cas war下载:https://oss.sonatype.org/content/repositories/releases/org/apereo/cas/cas-server-webapp-tomcat/
参考文章:
原理解析:https://www.cnblogs.com/lihuidu/p/6495247.html
原理和实现:https://blog.csdn.net/qq_24708791/article/details/78535565
cas系列:http://www.cnblogs.com/zzhuyongxin/tag/cas/
实战:https://blog.csdn.net/zzq900503/article/category/6692471
cas5.2实战:https://blog.csdn.net/yelllowcong/article/category/7347371