CAS单点登录简单介绍及简单使用
2022-12-14 17:33:39 0 举报
AI智能生成
单点登录
作者其他创作
大纲/内容
CAS介绍
简介:
CAS是Central Authentication Service的缩写,中央认证服务,一种独立开放指令协议。CAS是耶鲁大学(Yale University)发起的一个开源项目,旨在为Web应用系统提供一种可靠的单点登录方法,CAS在2004年12月正式成为JA-SIG的一个项目;CAS为CS架构
特点:
开源的企业级单点登录解决方案
CAS Server为需要独立部署的Web应用
CAS Client支持非常多的客户端(这里指单点登录系统中的各个Web应用),包括Java,Net,PHP,Perl,Apache,uPortal,Ruby等。
CAS属于Apache2.0许可证,允许代码修改,再发布(作为开源或商业软件)
原理和协议:
实现原理
从结构上看,CAS 包含两个部分: CAS Server 和 CAS Client。CAS Server 需要独立部署,主要负责对用户的认证工作;CAS Client 负责处理对客户端受保护资源的访问请求,需要登录时,重定向到 CAS Server。图1 是 CAS 最基本的协议过程:
CAS Client 与受保护的客户端应用部署在一起,以 Filter 方式保护受保护的资源。对于访问受保护资源的每个 Web 请求,CAS Client 会分析该请求的 Http 请求中是否包含 Service Ticket,如果没有,则说明当前用户尚未登录,于是将请求重定向到指定好的 CAS Server 登录地址,并传递 Service (也就是要访问的目的资源地址),以便登录成功过后转回该地址。用户在第 3 步中输入认证信息,如果登录成功,CAS Server 随机产生一个相当长度、唯一、不可伪造的 Service Ticket,并缓存以待将来验证,之后系统自动重定向到 Service 所在地址,并为客户端浏览器设置一个 Ticket Granted Cookie(TGC),CAS Client 在拿到 Service 和新产生的 Ticket 过后,在第 5,6 步中与 CAS Server 进行身份核实,以确保 Service Ticket 的合法性。
在该协议中,所有与 CAS 的交互均采用 SSL 协议,确保,ST 和 TGC 的安全性。协议工作过程中会有 2 次重定向的过程,但是 CAS Client 与 CAS Server 之间进行 Ticket 验证的过程对于用户是透明的。
另外,CAS 协议中还提供了 Proxy (代理)模式,以适应更加高级、复杂的应用场景,具体介绍可以参考 CAS 官方网站上的相关文档。
CAS Client 与受保护的客户端应用部署在一起,以 Filter 方式保护受保护的资源。对于访问受保护资源的每个 Web 请求,CAS Client 会分析该请求的 Http 请求中是否包含 Service Ticket,如果没有,则说明当前用户尚未登录,于是将请求重定向到指定好的 CAS Server 登录地址,并传递 Service (也就是要访问的目的资源地址),以便登录成功过后转回该地址。用户在第 3 步中输入认证信息,如果登录成功,CAS Server 随机产生一个相当长度、唯一、不可伪造的 Service Ticket,并缓存以待将来验证,之后系统自动重定向到 Service 所在地址,并为客户端浏览器设置一个 Ticket Granted Cookie(TGC),CAS Client 在拿到 Service 和新产生的 Ticket 过后,在第 5,6 步中与 CAS Server 进行身份核实,以确保 Service Ticket 的合法性。
在该协议中,所有与 CAS 的交互均采用 SSL 协议,确保,ST 和 TGC 的安全性。协议工作过程中会有 2 次重定向的过程,但是 CAS Client 与 CAS Server 之间进行 Ticket 验证的过程对于用户是透明的。
另外,CAS 协议中还提供了 Proxy (代理)模式,以适应更加高级、复杂的应用场景,具体介绍可以参考 CAS 官方网站上的相关文档。
原理图
工作原理图
1、访问服务:SSO客户端发送请求访问应用系统提供的服务资源。
2、重定向认证:SSO客户端会重定向用户请求到SSO服务器。
3、用户验证:用户身份认证。
4、生成票据:SSO服务器会产生一个随机的Service Ticket。
5、验证票据:SSO服务器验证票据Service Ticket的合法性,验证通过后,允许客户端访问服务。
6、传输用户信息:SSO服务器验证票据通过后,传输用户认证结果信息给客户端。
2、重定向认证:SSO客户端会重定向用户请求到SSO服务器。
3、用户验证:用户身份认证。
4、生成票据:SSO服务器会产生一个随机的Service Ticket。
5、验证票据:SSO服务器验证票据Service Ticket的合法性,验证通过后,允许客户端访问服务。
6、传输用户信息:SSO服务器验证票据通过后,传输用户认证结果信息给客户端。
CAS架构
cas架构图,CS架构
CAS流程
实现流程
1、用户在单点登录服务器的登录页面中,输入用户名和密码。
2、然后单点登录服务器会对用户名和密码进行认证。认证本身并不是单点登录服务器的功能,因此,通常会引入某种认证机制。认证机制可以有很多种,例如自己写一个认证程序,或者使用一些标准的认证方法,例如LDAP或者数据库等等。在大多数情况下,会使用LDAP进行认证。这是因为LDAP在处理用户登录方面,有很多独特的优势,这在本文的后面还会比较详细地进行介绍。
3、认证通过之后,单点登录服务器会和应用程序进行一个比较复杂的交互,这通常是某种授权机制。CAS使用的是所谓的Ticket。具体这点后面还会介绍。
4、授权完成后,CAS把页面重定向,回到Web应用。Web应用此时就完成了成功的登录(当然这也是单点登录的客户端,根据返回的Ticket信息进行判断成功的)。
5、然后单点登录服务器会在客户端创建一个Cookie。注意,是在用户的客户端,而不是服务端创建一个Cookie。这个Cookie是一个加密的Cookie,其中保存了用户登录的信息。
6、如果用户此时希望进入其他Web应用程序,则安装在这些应用程序中的单点登录客户端,首先仍然会重定向到CAS服务器。不过此时CAS服务器不再要求用户输入用户名和密码,而是首先自动寻找Cookie,根据Cookie中保存的信息,进行登录。登录之后,CAS重定向回到用户的应用程序。
2、然后单点登录服务器会对用户名和密码进行认证。认证本身并不是单点登录服务器的功能,因此,通常会引入某种认证机制。认证机制可以有很多种,例如自己写一个认证程序,或者使用一些标准的认证方法,例如LDAP或者数据库等等。在大多数情况下,会使用LDAP进行认证。这是因为LDAP在处理用户登录方面,有很多独特的优势,这在本文的后面还会比较详细地进行介绍。
3、认证通过之后,单点登录服务器会和应用程序进行一个比较复杂的交互,这通常是某种授权机制。CAS使用的是所谓的Ticket。具体这点后面还会介绍。
4、授权完成后,CAS把页面重定向,回到Web应用。Web应用此时就完成了成功的登录(当然这也是单点登录的客户端,根据返回的Ticket信息进行判断成功的)。
5、然后单点登录服务器会在客户端创建一个Cookie。注意,是在用户的客户端,而不是服务端创建一个Cookie。这个Cookie是一个加密的Cookie,其中保存了用户登录的信息。
6、如果用户此时希望进入其他Web应用程序,则安装在这些应用程序中的单点登录客户端,首先仍然会重定向到CAS服务器。不过此时CAS服务器不再要求用户输入用户名和密码,而是首先自动寻找Cookie,根据Cookie中保存的信息,进行登录。登录之后,CAS重定向回到用户的应用程序。
CAS应用交互详解
浏览器与APP01服务端
1、浏览器第一次访问受保护的APP01服务端,由于未经授权而被拦截并重定向到CAS服务端。
2、浏览器第一次与CAS服务端通讯,鉴权成功后由CAS服务端创建全局会话SSO会话,生成全局会话标识TGT并存在浏览器Cookie中。
3、浏览器重定向到APP01,重写URL地址带上全局会话标识TGT。
4、APP01拿到全局会话标识TGT后向CAS服务端请求校验,若校验成功,则APP01会获取到已经登录的用户信息。
5、APP01创建局部会话Session,并将SessionID存储到浏览器Cookie中。
6、浏览器与APP01建立会话。
2、浏览器第一次与CAS服务端通讯,鉴权成功后由CAS服务端创建全局会话SSO会话,生成全局会话标识TGT并存在浏览器Cookie中。
3、浏览器重定向到APP01,重写URL地址带上全局会话标识TGT。
4、APP01拿到全局会话标识TGT后向CAS服务端请求校验,若校验成功,则APP01会获取到已经登录的用户信息。
5、APP01创建局部会话Session,并将SessionID存储到浏览器Cookie中。
6、浏览器与APP01建立会话。
浏览器与APP02服务端
1、浏览器第一次访问受保护的APP02服务端,由于未经授权而被拦截并重定向到CAS服务端。
2、浏览器第二次与CAS服务端通讯,CAS校验Cookie中的全局会话标识TGT。
3、浏览器重定向到APP02,重写URL地址带上全局会话标识TGT。
4、APP02 拿到全局会话标识 TGT 后向CAS服务端请求校验,若校验成功,则APP02 会获取到已经登录的用户信息。
5、APP02 创建局部会话 Session,并将 SessionID 存储到浏览器 Cookie 中。
6、浏览器与 APP02 建立会话。
2、浏览器第二次与CAS服务端通讯,CAS校验Cookie中的全局会话标识TGT。
3、浏览器重定向到APP02,重写URL地址带上全局会话标识TGT。
4、APP02 拿到全局会话标识 TGT 后向CAS服务端请求校验,若校验成功,则APP02 会获取到已经登录的用户信息。
5、APP02 创建局部会话 Session,并将 SessionID 存储到浏览器 Cookie 中。
6、浏览器与 APP02 建立会话。
搭建Tomcat HTTPS支持
CAS采用HTTPS协议处理用户请求,需要配置Tomcat支持HTTPS协议
生成秘钥库
采用JDK自带的keytool工具生成秘钥库
别名java1234 存储路径D:\cas\keystore
keytool -genkey -v -alias java1234 -keyalg RSA -keystore D:\cas\keystore\java1234.keystore
java1234:别名
RSA:加密方式
D:\cas\keystore\java1234.keystore:存储路径
RSA:加密方式
D:\cas\keystore\java1234.keystore:存储路径
生成秘钥库
从秘钥库里导出证书
keytool -export -trustcacerts -alias java1234 -file D:/cas/keystore/java1234.cer -keystore D:/cas/keystore/java1234.keystore
导出证书
生成的证书文件
将证书导入到JDK证书库
keytool -import -trustcacerts -alias java1234 -file D:/cas/keystore/java1234.cer -keystore "D:/Program Files/Java/jdk1.8.0_221/jre/lib/security/cacerts"
专门的密码:changeit
导入证书
tomcat配置https支持
采用的是tomcat8
找到tomcat-》conf-》server.xml打开文件添加
<Connector port="8843" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS"
keystoreFile="D:\cas\keystore\java1234.keystore"
keystorePass="123456"/>
maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS"
keystoreFile="D:\cas\keystore\java1234.keystore"
keystorePass="123456"/>
8843:端口
org.apache.coyote.http11.Http11NioProtocol:协议
150:最大线程
SSLEnabled:是否开启SSL
D:\cas\keystore\java1234.keystore:存储路径
123456:密码
org.apache.coyote.http11.Http11NioProtocol:协议
150:最大线程
SSLEnabled:是否开启SSL
D:\cas\keystore\java1234.keystore:存储路径
123456:密码
启动bin下的startup.bat
解决乱码
默认有中文乱码,可以我们来到tomcat目录的conf子目录中,找到一个名为“logging.properties”的文件,打开这个文本文件,找到如下配置项:
java.util.logging.ConsoleHandler.encoding = UTF-8
将UTF-8修改为GBK保存,重启tomcat
java.util.logging.ConsoleHandler.encoding = UTF-8
将UTF-8修改为GBK保存,重启tomcat
测试
tomcat默认访问路径是localhost:8080
正常访问tomcat
配好后访问:https://localhost:8843
配好后访问tomcat
CAS Server服务端搭建
CAS Server war下载
官网:https://www.jasig.org
github官网:https://github.com/apereo/cas
cas服务端
https://github.com/apereo/cas-overlay-template
https://repo1.maven.org/maven2/cas
打包好的war包网址:
https://repo1.maven.org/maven2/org/apereo/cas/cas-server-webapp-tomcat/5.3.14
CAS Server发布到tomcat
把打包好的war包下载好
下载war包
找到tomcat安装目录,进入webapps文件夹,把下载好的war包方到此处
war包
进入bin目录,双击startup.bat文件运行tomcat,tomcat会自动解压下载的war包
启动tomcat
启动后产生解压文件,名称过长为了方便改名为cas
改名
关闭tomcat,从新启动tomcat
访问:https://localhost:8843/cas
访问cas
配置hosts:C:\Windows\System32\drivers\etc
打开hosts文件添加:127.0.0.1 java1234.com
设置域名访问
访问:https://java1234.com:8843/cas
域名访问
查看用户名密码
打开tomcat目录,进入解压好的war包,WEB-INF->classes
打开application.properties文件
casuser:用户名;Mellon:密码
打开log4j2.xml文件修改日志存储路径
日志存储路径
配置数据源,数据库用户认证
创建数据库
修改application.properties配置文件
把写死的用户名和密码注释掉
注释认证用户
在application.properties配置文件中添加连接数据库配置
复制jdbc和mysql的jar包到项目WEB-INF-》lib下
四个jar包
重新启动tomcat
测试:
访问:https://java1234.com:8843/cas
重新访问
输入数据库里的用户名和密码
用户名和密码
登录成功
密码加密校验
修改application.properties文件
MD5加密
把数据库密码修改为加密后的密码,使用MD5加密:SELECT MD5('123456')
重新启动tomcat
进行测试
CAS Client+springboot客户端整合搭建
创建父工程导入依赖
创建子工程导入依赖
子工程创建application.yml配置文件并设置端口
在resources文件夹下创建html文件
启动服务进行访问
访问
未登录实现跳转到CAS登录
子工程添加依赖
启动类上加上@EnableCasClient注解
application.yml配置文件添加cas配置
controller层添加一个接口
创建ModelAndView对象
设置该对象的ViewName名称为"index",html页面名称
把该对象进行返回
代码:
pom.xml文件
application.yml文件
index.html文件
启动类
Controller层
跳转CAS
报错原因是cas服务默认不支持http请求,可以通过配置来让其支持http请求
打开tomcat安装目录:webapps\cas\WEB-INF\classes\services
修改HTTPSandIMAPS-10000001.json文件
打开tomcat安装目录:webapps\cas\WEB-INF\classes\services
修改HTTPSandIMAPS-10000001.json文件
解决方式:
打开HTTPSandIMAPS-10000001.json文件,将
"serviceId':"^(https|imaps)://.*"
修改成
"serviceId':"^(https|imaps|http)://.*"
"serviceId':"^(https|imaps)://.*"
修改成
"serviceId':"^(https|imaps|http)://.*"
修改后图
进入application.properties文件添加
cas.tgc.secure=false
cas.serviceRegistry.initFromJson=true
cas.tgc.secure=false
cas.serviceRegistry.initFromJson=true
修改application.properties文件
重新启动tomcat
显示用名
在html文件中添加
欢迎: <font th:text="${session._const_cas_assertion_.principal.name}"></font> 进入crm客户关系;
注销
在html文件中添加
<a href="/logout">安全退出</a>
在Controller层添加退出接口,就是重定向到服务端的logout
CAS单点登录实例实现+测试
复制一个服务出来并修改端口以及访问的路径
同时启动两个服务
访问任意一个服务如果没有登录会跳转登录,登录后另一个访问可以直接访问
服务A
服务B
代码示例:
0 条评论
下一页