一、项目背景
公司需要搭建单点登录服务, 使所有系统共用一套登录逻辑.
对比了多个方案之后, 选用了CAS. 因此首先要搭建CAS服务, 因为涉及到JDK、gradle等组件的版本,最终选择了6.3版本。
后端:SpringBoot 2.3.12(已集成SpringSecurity,并接入SpringCloud Alibaba微服务)
前端:vue2
二、CAS简介
CAS是一个单点登录的开源框架,遵循apache2.0协议,代码托管在github上。
单点登录使用户仅需一次登录便可操作所有系统(系统可以是不同源,即不同的域名、IP及端口)。
CAS登录在前后端不分离的情况下,官方已经给了源码示例
但是在前后端分离的情况下,改动的代码会多一些。
之前翻过很多"大佬"的帖子,多少都有坑,有些人甚至直接给出了CAS不适合前后端分离的结论?!简直震惊四座。
三、实现思路
首先是Spring Security的登录流程:
- 用户在浏览器发起请求web系统私有资源 /private;
- SecurityFilterChain过滤器链路到达FilterSecurityInterceptor,
- 并抛出访问被拒绝的异常AccessDeniedException,
- ExceptionTranslationFilter捕获该异常并通过sendStartAuthentication方法进入CasAuthenticationEntryPoint(AuthenticationEntryPoint的实现类)
- CasAuthenticationEntryPoint设置重定向到CAS Server地址https://cas.poop.com/cas/login?service=https%3A%2F%2Fportal.popo.com%2Fwebapp%2Flogin/cas。

然后是CAS认证的流程:
-
用户在CAS Server登录验证完后,携带ST跳转到客户端https://cas.poop.com/cas/login?service=https%3A%2F%2Fportal.popo.com%2Fwebapp%2Flogin/cas%3Fticket%3DST-0-ER94xMJmn6pha35CQRoZ) ,进入CasAuthenticationFilter;
-
CasAuthenticationFilter将ST包装成UsernamePasswordAuthenticationToken请求AuthenticationManager进行认证处理;
-
AuthenticationManager将认证委托给CasAuthenticationProvider;
-
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,成功后获取用户登录信息。
-
最后,CasAuthenticationProvider使用AuthenticationUserDetailsService进行后置处理,一般获取更加详细的用户信息,例如权限等。
最后是CAS单点登录的总体流程, 流程并不复杂,引用大佬的一张图:

前后端分离的CAS验证流程, 涉及到三个模块,分别为系统前端、系统后端及单点登录CAS服务,流程可以简单概括为三步:
- 第一步:前端访问后端,后端发现未登陆,重定向至CAS服务进行登录。
- 第二步:登录成功后,CAS服务携带登录成功的ticket凭证跳转回前端, 写入jsessionid。
- 第三步:前端拿到ticket访问后端进行验证,若验证成功则为登录成功, 返回token。
四、后端代码实现
1. 引入依赖
<!-- spring security -->
<dependency>
<groupId>org.springframework.boot</groupId&g

最低0.47元/天 解锁文章
5599

被折叠的 条评论
为什么被折叠?



