什么是单点登录:
单点登录又叫做SSO, SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。
在大型项目中,存在诸多子系统分别部署在不同服务器上,但是tomcat的session不能共享,
因此就需要SSO 单点登陆。
为什么需要SSO:
1、传统登录流程:
1. 在登录页面输入用户名密码
2. 在controller中接收用户名密码并且校验是否正确
3. 如果不正确, 跳转到登录页面重新登录
4. 正确放行, 并且将用户登录信息记录到tomcat的session中
5. 编写拦截器, 拦截所有请求, 每次请求都判断tomcat的session中是否有用户登录信息
如果没有则跳转到登录页面重新登录, 如果有则放行
2、无法解决的问题:
1、在互联网分布式项目中,多个系统互相调用,例如在商品列表跳转到商品详情页。
2、在传统大型项目中,有许多小系统,如果每个系统都需要登陆一次很麻烦。
3、tomcat的session是否能够跨tomcat?是否能够多个项目共享使用?
不能.
浏览器访问项目, 会建立session会话, 浏览器关闭, 会话销毁. session无法跨Tomcat使用.
使用场景(作用):
传统企业项目: 做系统权限集成
互联网项目: soa分布式架构下, 是多个项目, 如果跨项目跳转访问能够自动认证.
单点登陆原理图:
SSO单点登录访问流程主要有以下步骤:
- 访问服务:SSO客户端发送请求访问应用系统提供的服务资源。
- 定向认证:SSO客户端会重定向用户请求到SSO服务器。
- 用户认证:用户身份认证。
- 发放票据:SSO服务器会产生一个随机的Service Ticket。
- 验证票据:SSO服务器验证票据Service Ticket的合法性,验证通过后,允许客户端访问服务。
- 传输用户信息:SSO服务器验证票据通过后,传输用户认证结果信息给客户端。
用户第一次访问会跳转到认证系统的登陆页面,认证成功后会发放令牌(ticket) 写入到浏览器cookie中,
然后用户每次访问都会带着令牌,验证令牌通过就会自动放行。
不用框架实现SSO流程:
什么是CAS
cas是耶鲁大学的开源项目, 单点登录的一个解决方案.
1、优点: 使用cas, 零代码 就可以实现单点登录.
原理是cas是一个现成的项目 部署到linux系统形成单点登录服务器, 项目中配置cas的客户端工具包, 就可以不用写代码实现单点登录.(各种功能通过配置文件来实现)
2、CAS原理
从结构上看,CAS 包含两个部分: CAS Server 和 CAS Client。
CAS Server 需要独立部署,主要负责对用户的认证工作;(认证系统服务器)
CAS Client 负责处理对客户端受保护资源的访问请求,需要登录时,重定向到 CAS Server。(部署到各个子系统中)
CAS Demo演示
1、创建两个项目,导入依赖坐标
<!-- cas 客户端工具包-->
<dependency>
<groupId>org.jasig.cas.client</groupId>
<artifactId>cas-client-core</artifactId>
<version>3.3.3</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
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.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>CASFilter</filter-name>
<filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
<init-param>
<param-name>casServerLoginUrl</param-name>
<!-- cas认证服务器地址 -->
<param-value>http://192.168.200.128:9100/cas/login</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<!-- 认证成功后跳转地址 -->
<param-value>http://localhost:9001</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CASFilter</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>http://192.168.200.128:9100/cas</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://localhost:9001</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>
</web-app>
3、测试流程图(补充)