单点登录的CAS实践

一、在谈项目实践之前,先说两个概念:

(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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值