SprinBoot(SpringSecurity)+前后端分离 集成CAS单点登录

一、项目背景

公司需要搭建单点登录服务, 使所有系统共用一套登录逻辑.

对比了多个方案之后, 选用了CAS. 因此首先要搭建CAS服务, 因为涉及到JDK、gradle等组件的版本,最终选择了6.3版本。

后端:SpringBoot 2.3.12(已集成SpringSecurity,并接入SpringCloud Alibaba微服务)
前端:vue2

二、CAS简介

CAS是一个单点登录的开源框架,遵循apache2.0协议,代码托管在github上。

单点登录使用户仅需一次登录便可操作所有系统(系统可以是不同源,即不同的域名、IP及端口)。

CAS登录在前后端不分离的情况下,官方已经给了源码示例

但是在前后端分离的情况下,改动的代码会多一些。

之前翻过很多"大佬"的帖子,多少都有坑,有些人甚至直接给出了CAS不适合前后端分离的结论?!简直震惊四座。

三、实现思路

首先是Spring Security的登录流程:

  1. 用户在浏览器发起请求web系统私有资源 /private;
  2. SecurityFilterChain过滤器链路到达FilterSecurityInterceptor,
  3. 并抛出访问被拒绝的异常AccessDeniedException,
  4. ExceptionTranslationFilter捕获该异常并通过sendStartAuthentication方法进入CasAuthenticationEntryPoint(AuthenticationEntryPoint的实现类)
  5. CasAuthenticationEntryPoint设置重定向到CAS Server地址https://cas.poop.com/cas/login?service=https%3A%2F%2Fportal.popo.com%2Fwebapp%2Flogin/cas。
    Spring Security登录认证流程.jpg

然后是CAS认证的流程:

  1. 用户在CAS Server登录验证完后,携带ST跳转到客户端https://cas.poop.com/cas/login?service=https%3A%2F%2Fportal.popo.com%2Fwebapp%2Flogin/cas%3Fticket%3DST-0-ER94xMJmn6pha35CQRoZ) ,进入CasAuthenticationFilter;

  2. CasAuthenticationFilter将ST包装成UsernamePasswordAuthenticationToken请求AuthenticationManager进行认证处理;

  3. AuthenticationManager将认证委托给CasAuthenticationProvider;

  4. CasAuthenticationProvider使用TicketValidator向CAS Server发起ST校验请求https://cas.poop.com/cas/login?service=https%3A%2F%2Fportal.popo.com%2Fwebapp%2Flogin/cas&ticket=ST-0-ER94xMJmn6pha35CQRoZ,成功后获取用户登录信息。

  5. 最后,CasAuthenticationProvider使用AuthenticationUserDetailsService进行后置处理,一般获取更加详细的用户信息,例如权限等。

最后是CAS单点登录的总体流程, 流程并不复杂,引用大佬的一张图:

cas登录流程.png

前后端分离的CAS验证流程, 涉及到三个模块,分别为系统前端、系统后端及单点登录CAS服务,流程可以简单概括为三步:

  • 第一步:前端访问后端,后端发现未登陆,重定向至CAS服务进行登录。
  • 第二步:登录成功后,CAS服务携带登录成功的ticket凭证跳转回前端, 写入jsessionid。
  • 第三步:前端拿到ticket访问后端进行验证,若验证成功则为登录成功, 返回token。

四、后端代码实现

1. 引入依赖
<!--    spring security    -->
<dependency>
    <groupId>org.springframework.boot</groupId&g
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值