CAS ( Central Authentication Service ) 是 Yale 大学发起的一个企业级的、开源的项目,旨在为 Web 应用系统提供一种可靠的单点登录解决方法(属于 Web SSO )。CAS 开始于 2001 年, 并在 2004 年 12 月正式成为 JA-SIG 的一个项目。
✪使用场景:一般解决多个系统重复登录的问题,通过单点登录只需要一次登录就可以在多个系统之间安全访问。
✪实现的流程基础模式 SSO 访问流程主要有以下步骤:
访问服务: SSO 客户端发送请求访问应用系统提供的服务资源。
定向认证: SSO 客户端会重定向用户请求到 SSO 服务器。
用户认证:用户身份认证。
发放票据: SSO 服务器会产生一个随机的 Service Ticket 。
验证票据: SSO 服务器验证票据 Service Ticket 的合法性,验证通过后,允许客户端访问服务。
传输用户信息: SSO 服务器验证票据通过后,传输用户认证结果信息给客户端。
下面是 CAS 最基本的协议过程:
CAS实现SSO单点登录原理
基础协议图
如 上图: CAS Client 与受保护的客户端应用部署在一起,以 Filter 方式保护 Web 应用的受保护资源,过滤从客户端过来的每一个 Web 请求,同 时, CAS Client 会分析 HTTP 请求中是否包含请求 Service Ticket( ST 上图中的 Ticket) ,如果没有,则说明该用户是没有经过认证的;于是 CAS Client 会重定向用户请求到 CAS Server ( Step 2 ),并传递 Service (要访问的目的资源地址)。 Step 3 是用户认证过程,如果用户提供了正确的 Credentials , CAS Server 随机产生一个相当长度、唯一、不可伪造的 Service Ticket ,并缓存以待将来验证,并且重定向用户到 Service 所在地址(附带刚才产生的 Service Ticket ) , **并为客户端浏览器设置一个 Ticket Granted Cookie ( TGC ) **; CAS Client 在拿到 Service 和新产生的 Ticket 过后,在 Step 5 和 Step6 中与 CAS Server 进行身份核实,以确保 Service Ticket 的合法性。
在该协议中,所有与 CAS Server 的交互均采用 SSL 协议,以确保 ST 和 TGC 的安全性。协议工作过程中会有 **2 次重定向 **的过程。但是 CAS Client 与 CAS Server 之间进行 Ticket 验证的过程对于用户是透明的(使用 HttpsURLConnection )。
CAS 请求认证时序图如下:
CAS实现SSO单点登录原理
准备两个客户端(cas client)和一个服务端(cas servers)
1.准备证书
这里注意设置CN的值得时候设置的域名要和下面设置host的域名一样
2.准备一个干净的tomcat
tomcat下载地址:http://tomcat.apache.org/download-80
自己没有域名,本机测试修改host文件利用本机的本地ip模拟一个域名
windows路径:C:\Windows\System32\drivers\etc 查看ip: ipconfig
mac: sudo vi /etc/hosts 查看ip: ifconfig
3.在tomcat导入我们的cas服务端的war包,并更具自己的需要修改cas服务端配置
cas服务端的war包:https://pan.baidu.com/s/1TjKD2avZMPJndfijF61npA
默认登录名和密码在web-inf下deployerConfigContext.xml 里面xml写死配置的,真实使用肯定是配置数据库查表中的用户名密码的,我们先看下xml写死配置在那个位置
下面是修改配置文件,连接数据库,我们以mysql为例,如果是oracle,连接配置和jar换成oracle就行
1)修改cas服务端中web-info下deployerConfigContext.xml ,添加如下配置
p:driverClass="com.mysql.jdbc.Driver" p:jdbcUrl="jdbc:mysql://127.0.0.1:3306/pinyougoudb?characterEncoding=utf8" p:user="root" p:password="123456" /> class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder" c:encodingAlgorithm="MD5" p:characterEncoding="UTF-8" /> class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler" p:dataSource-ref="dataSource" p:sql="select password from tb_user where username = ?" p:passwordEncoder-ref="passwordEncoder"/> |
然后在配置文件开始部分找到如下配置
|
其中
|
一句是使用固定的用户名和密码,我们在下面可以看到这两个bean ,如果我们使用数据库认证用户名和密码,需要将这句注释掉。
添加下面这一句配置
|
将以下四个jar包放入webapps\cas\WEB-INF\lib下
(这三个jar包在资源\cas\jar目录下)
jar包的连接:https://pan.baidu.com/s/1qvkvjuE6bwEsXoJiHQR1HQ
用数据库中的用户名和密码进行测试
1.创建连个client端
创建一个工作空间
分别创建两个maven项目,比如shop1和shop2
导入cas-client 的maven的坐标
1)搭建工程引入依赖
创建Maven工程 (war)casclient_demo1 引入cas客户端依赖并制定tomcat运行端口为9001
<dependencies>
<dependency> <groupId>org.jasig.cas.clientgroupId> <artifactId>cas-client-coreartifactId> <version>3.3.3version> dependency> <dependency> <groupId>javax.servletgroupId> <artifactId>servlet-apiartifactId> <version>2.5version> <scope>providedscope> dependency> dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.pluginsgroupId> <artifactId>maven-compiler-pluginartifactId> <version>2.3.2version> <configuration> <source>1.7source> <target>1.7target> configuration> plugin> <plugin> <groupId>org.apache.tomcat.mavengroupId> <artifactId>tomcat7-maven-pluginartifactId> <configuration>
<port>9001port>
<path>/path> configuration> plugin> plugins> build> |
(2)添加web.xml
xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<listener> <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListenerlistener-class> listener>
<filter> <filter-name>CAS Single Sign Out Filterfilter-name> <filter-class>org.jasig.cas.client.session.SingleSignOutFilterfilter-class> filter> <filter-mapping> <filter-name>CAS Single Sign Out Filterfilter-name> <url-pattern>/*url-pattern> filter-mapping>
<filter> <filter-name>CASFilterfilter-name> <filter-class>org.jasig.cas.client.authentication.AuthenticationFilterfilter-class> <init-param> <param-name>casServerLoginUrlparam-name> <param-value>http://localhost:9100/cas/loginparam-value>
init-param> <init-param> <param-name>serverNameparam-name> <param-value>http://localhost:9001param-value> init-param> filter> <filter-mapping> <filter-name>CASFilterfilter-name> <url-pattern>/*url-pattern> filter-mapping>
<filter> <filter-name>CAS Validation Filterfilter-name> <filter-class> org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilterfilter-class> <init-param> <param-name>casServerUrlPrefixparam-name> <param-value>http://localhost:9100/casparam-value> init-param> <init-param> <param-name>serverNameparam-name> <param-value>http://localhost:9001param-value> init-param> filter> <filter-mapping> <filter-name>CAS Validation Filterfilter-name> <url-pattern>/*url-pattern> filter-mapping>
<filter> <filter-name>CAS HttpServletRequest Wrapper Filterfilter-name> <filter-class> org.jasig.cas.client.util.HttpServletRequestWrapperFilterfilter-class> filter> <filter-mapping> <filter-name>CAS HttpServletRequest Wrapper Filterfilter-name> <url-pattern>/*url-pattern> filter-mapping>
<filter> <filter-name>CAS Assertion Thread Local Filterfilter-name> <filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilterfilter-class> filter> <filter-mapping> <filter-name>CAS Assertion Thread Local Filterfilter-name> <url-pattern>/*url-pattern> filter-mapping> web-app> |
(3)编写index.jsp
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>商城1title> head> <body> 商城1.。。。。 <%=request.getRemoteUser()%> body> html> |
request.getRemoteUser()为获取远程登录名
案例连接:
参考:链接:https://www.jianshu.com/p/cf2879762f24