【cas】sso和cas概述
一、sso问题由来
所以需要这一种系统,sso在多个应用系统中,用户只需要登录一次,就可以访问所有互相信任的应用系统。
CAS(Central Authentication Service)*认证服务,CAS是一款不多的针对web应用的单点登录框框架。
sso的解方案很多,比如收费的UTrust,惠普灵动等,开源的有CAS、SmartSSO等,其中应用最为广泛的是CAS。二、实现机制
(2) 根据登录信息,认证系统进行身份验证。如果验证通过,返回给用户䘝认证的凭据(ticket),用户再次访问别的应用的时候,就会带上ticket。作为自己认证的凭证。
(3)第二次访问别的应用系统时,应用系统接收到请求之后,会把这个ticket送到认证系统进行验证,检查ticket的合法性,如果通过校验,
用户就可以在不再次登录的情况下访问系统2和系统3了。
单点登录需要解决的问题,解决如何产生和存储那个信任,再就是其他系统如何验证这个系统的有效性。存储信任、验证信任
(4)实现机制大体上分为两种,session机制和cookie机制。cas采用的是cookie机制。
三、sso解决方案:cas
1.特点
(1)开源、企业级项目。
(2)旨在为web系统提供一种可靠的单点登录的解决方案。
2.结构体系
从结构上看,分为两部分,CAS Server为需要独立部署的web应用,CASClient为非常多的客户端提供支持。这个客户端指单点登录系统中的各个web应用,包括java,.net等。
CAS server
负责完成用户认证工作,需独立部署。server会处理用户名、密码等凭证
CAS Client
负责处理对客户端受保护资源的访问请求,需要登录时候,重定向到CAS Server进行认证。(cas Client与受保护的客户端应用部署在一起,以Filter方式保护受保护的资源)
3.协议过程
最基本协议过程:
1.用户第一次登录,判断是否有Session,如果无Session,重定向到浏览器。
2.对于访问的每个web请求,Cas client会分析该请求的http请求中是否包含Service Ticket,如果没有,那说明用户未登陆了。于是将请求重定向到已经指定好的CAS Service登录地址,并且传递Service(也就是要访问的目的地址),以便登录成功之后,直接跳转到该目的地址。
3.用户在第三步输入认证信息,如果登录成功,CAS service随机产生一个相当长度的、唯一的、不可伪造的Service Ticket,并且缓存等待将来验证,之后系统自动重定向到Service所在的地址,并且客户端设置一个Ticket Granted Cookie(TGC)
4.CAS Client在拿到Service和新产生的Ticket之后,在第5/6步中和CAS Service进行身份验证,来确保Service Ticket的合法性。
所有和cas的交互都采用SSL协议,确保ST和TGC的安全性。协议过程中会有两次重定向的过程,但是CAS Client和CAS Server之间进行Ticket验证的过程对于用户来说,是透明的。
CAS默认采用的是HTTPS协议,如果对于安全性不高,可以采用HTTP协议。
三、部署测试过程
1.部署cas-server-webapp-3.4.11.war文件,直接放在tomcat下的webapps目录下。
2.部署CAS-Client,解压cas-client-core-3.2.1.jar
3.部署两台tomcat,每个tomcat下部署一个web应用。
Tomcat conf文件端口号避免冲突,需要修改如下:
<Server port="28005" shutdown="SHUTDOWN">
<Connector port="28080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="28443" />
<Connector port="28009" protocol="AJP/1.3" redirectPort="28443" />
web程序web.xml中的更改
<!-- ======================== 单点登录开始 ======================== -->
<!-- 用于单点退出,该过滤器用于实现单点登出功能,可选配置-->
<listener>
<listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
</listener>
<!-- 该过滤器用于实现单点登出功能,可选配置。 -->
<filter>
<filter-name>CAS Single Sign Out Filter</filter-name>
<filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CAS Single Sign Out Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>CAS Filter</filter-name>
<filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
<init-param>
<param-name>casServerLoginUrl</param-name>
<param-value>https://demo.micmiu.com:8443/cas/login</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://app2.micmiu.com:28080</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CAS Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 该过滤器负责对Ticket的校验工作,必须启用它 -->
<filter>
<filter-name>CAS Validation Filter</filter-name>
<filter-class>
org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class>
<init-param>
<param-name>casServerUrlPrefix</param-name>
<param-value>https://demo.micmiu.com:8443/cas</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<!-- tomcat部署下的应用访问端口号 -->
<param-value>http://app2.micmiu.com:28080</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CAS Validation Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--
该过滤器负责实现HttpServletRequest请求的包裹,
比如允许开发者通过HttpServletRequest的getRemoteUser()方法获得SSO登录用户的登录名,可选配置。
-->
<filter>
<filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
<filter-class>
org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--
该过滤器使得开发者可以通过org.jasig.cas.client.util.AssertionHolder来获取用户的登录名。 比如AssertionHolder.getAssertion().getPrincipal().getName()。 -->
<filter>
<filter-name>CAS Assertion Thread Local Filter</filter-name>
<filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CAS Assertion Thread Local Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- ======================== 单点登录结束 ======================== -->
3.测试过程
预期流程: 打开app1 url —-> 跳转cas server 验证 —-> 显示app1的应用 —-> 打开app2 url —-> 显示app2应用 —-> 注销cas server —-> 打开app1/app2 url —-> 重新跳转到cas server 验证
推荐阅读
-
spring boot 1.5.4 集成shiro+cas,实现单点登录和权限控制
-
使用CAS变量和CountDownLatch保证线程间的同步-匀速的发送短信 多线程
-
白云观--多线程系列之CAS和原子操作(十)
-
CAS与ABA问题产生和优雅解决
-
CAS做单点登陆(SSO)——集成Java Web 项目
-
每日一个知识点:Volatile 和 CAS 的弊端之总线风暴
-
随意看看AtomicInteger类和CAS
-
springboot 集成cas5.3 实现sso单点登录详细流程
-
CAS做单点登陆(SSO)——集成Java Web 项目
-
CAS SSO单点登录服务端环境搭建 ssocassso cassso单点登录cas单点登录