一、在谈项目实践之前,先说两个概念:
(1)ruoyi-vue:采用前后端分离的单体web框架,参见介绍 | RuoYi,使用MIT开源协议,对商业使用友好。
(2)CAS:英文为Central Authentication Service,即中央认证服务,为耶鲁大学发起的一个开源项目,是实现sso单点登录的框架。官网地址:
https://www.apereo.org/projects/cas。关于spring secuity集成cas可参考:https://docs.spring.io/spring-security/site/docs/5.4.1/reference/html5/#servlet-cas。
CAS官方架构:
https://apereo.github.io/cas/development/planning/Architecture.html。
CAS架构图
CAS执行逻辑:CAS分CAS Server和CAS Client。其中CAS Server用于分发和验证tickets,CAS Client从CAS Server检索授权用户的身份。
时序图参见:
https://apereo.github.io/cas/development/protocol/CAS-Protocol.html。
(1)访问服务: SSO 客户端发送请求访问应用系统。
(2)定向认证: SSO 客户端重定向请求到 CAS服务器。
(3)用户认证:用户身份认证。
(4)发放票据: 成功登录后,CAS服务器向用户发放TGT(ticket-granting ticket)全局票据,创建SSO会话。Server端是TGT,Client端是TGC(Ticket Granted Cookie),类似于session和cookie。同时TGT签发一个ST返回给浏览器(如不同应用请求,发现TGC对应了一个TGT,同样会签发ST)。
(5)验证票据: CAS服务器验证票据 Service Ticket (ST)的合法性,验证通过后,允许客户端访问服务。ST作为Url中的get参数传递。
(6)传输用户信息:CAS服务器验证票据通过后,传输用户认证结果信息给客户端。
CAS执行逻辑图
二、回到正题,如何在ruoyi-vue(3.8.1)项目中集成CAS呢。由于ruoyi-vue基于spring seruity。需集成spring-security-cas依赖。另外认证要增加和CAS服务端的集成。
本文参考:RuoYi-Vue前后端分离版集成cas_GGX-520的博客-CSDN博客_ruoyi分离版cas
后端集成:
1、common模块添加对CAS的支持。
<!-- 添加spring security cas支持 -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-cas</artifactId>
</dependency>
2、配置文件修改
#CAS
cas:
server:
host:
#CAS服务地址
url: http://localhost:8888/cas
#CAS服务登录地址
login_url: ${cas.server.host.url}/login
#CAS服务登出地址
logout_url: ${cas.server.host.url}/logout?service=${app.server.host.url}
# 应用访问地址
app:
#开启cas
casEnable: true
server:
host:
url: http://localhost:${server.port}
#应用登录地址
login_url: /
#应用登出地址
logout_url: /logout
#前端登录地址
web_url: http://localhost/
3、修改LoginUser.java
由于CAS认证需要authorities属性,在common模块中直接new HashSet():
@Override
public Collection<? extends GrantedAuthority> getAuthorities()
{
return new HashSet();
}
4、在common模块中修改Constants.java
/**
* CAS登录成功后的后台标识
*/
public static final String CAS_TOKEN = "cas_token";
/**
* CAS登录成功后的前台Cookie的Key
*/
public static final String WEB_TOKEN_KEY = "Admin-Token";
5、在framework模块config.properties下新增CasProperties.java
CasProperties代码
6、在framework模块web.service下新增
CasUserDetailsService.java
CasUserDetailService代码
7、在framework模块security.handle下添加
CasAuthenticationSuccessHandler.java
CasAuthenticationSuccessHandler代码
8、在framework模块config.SecurityConfig下修改SecurityConfig。(setCasServerUrlPrefix 从cas-client 3.6.0已移除)
SecurityConfig代码
前端集成:
1、修改settings.js
settings.js代码
2、修改permission.js,判断没有token时访问cas登录页面
permission.js 代码
3、修改request.js、Navbar.vue,登出后不做响应
request.js代码
Navbar.vue代码
4、修改user.js,登出后跳转到cas登出页面
user.js代码
另外CAS Server需另外搭建。地址为:
https://github.com/apereo/cas/releases/