欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【cas】sso和cas概述

程序员文章站 2022-05-05 11:35:15
...


一、sso问题由来


    早期公司,每一家公司可能只有一个server,慢慢的server变多,每个server都需要登陆注册,退出的时候,要一一退出。例如:上豆瓣,要登录豆瓣FM、豆瓣读书、豆瓣电影、豆瓣日记等,用户体验不好。
所以需要这一种系统,sso在多个应用系统中,用户只需要登录一次,就可以访问所有互相信任的应用系统。

CAS(Central Authentication Service)*认证服务,CAS是一款不多的针对web应用的单点登录框框架。

sso的解方案很多,比如收费的UTrust,惠普灵动等,开源的有CAS、SmartSSO等,其中应用最为广泛的是CAS。


二、实现机制


(1)用户第一登录的时候,被引导到认证系统中进行登录
(2) 根据登录信息,认证系统进行身份验证。如果验证通过,返回给用户䘝认证的凭据(ticket),用户再次访问别的应用的时候,就会带上ticket。作为自己认证的凭证。
(3)第二次访问别的应用系统时,应用系统接收到请求之后,会把这个ticket送到认证系统进行验证,检查ticket的合法性,如果通过校验,
用户就可以在不再次登录的情况下访问系统2和系统3了。
单点登录需要解决的问题,解决如何产生和存储那个信任,再就是其他系统如何验证这个系统的有效性。存储信任、验证信任

【cas】sso和cas概述
(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.协议过程
最基本协议过程:
【cas】sso和cas概述


【cas】sso和cas概述


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 验证