单点登陆与 CAS

什么是单点登录:

单点登录又叫做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单点登录访问流程主要有以下步骤:

  1. 访问服务:SSO客户端发送请求访问应用系统提供的服务资源。
  2. 定向认证:SSO客户端会重定向用户请求到SSO服务器。
  3. 用户认证:用户身份认证。
  4. 发放票据:SSO服务器会产生一个随机的Service Ticket。
  5. 验证票据:SSO服务器验证票据Service Ticket的合法性,验证通过后,允许客户端访问服务。
  6. 传输用户信息: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、测试流程图(补充)
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值