ruoyi框架实现单点登录
时间: 2025-05-09 08:40:14 浏览: 37
<think>好的,我现在需要帮助用户解决在RuoYi框架中实现单点登录的问题。首先,我需要回忆一下RuoYi框架的基本结构,它是一个基于Spring Boot和Vue的前后端分离框架,所以单点登录的实现可能需要前后端的配合。
用户提到了参考引用中的代码片段,里面涉及到前端API的调用、Vuex存储的处理以及后端的依赖引入。因此,我应该分步骤来讲解如何在前端和后端进行配置。
首先,前端部分可能需要添加登录认证的API接口,比如loginSso和checkTicket。用户提供的代码示例中,已经在user.js的actions里添加了LoginSso方法,使用ticket进行认证,并设置token。这部分需要确认是否正确处理了token的存储和提交。
接下来,后端部分需要引入单点登录相关的依赖,比如Spring Security OAuth2或者JWT。用户提到的引用中,后端需要处理token的校验和生成,可能需要一个认证服务来验证ticket并返回token。同时,需要考虑如何与其他系统共享会话状态,比如使用Redis存储token,这样不同的子系统可以验证同一个token。
另外,单点登录的关键点在于认证中心的建立。用户可能需要一个独立的认证服务来处理登录请求,并生成ticket或token,其他系统通过校验这个token来确认用户身份。这里需要确保所有子系统都信任同一个认证中心,并且token的生成和验证机制要安全可靠。
还需要考虑跨域问题,因为单点登录通常涉及多个子系统的不同域名。前端可能需要配置CORS,后端也需要支持跨域请求。此外,token的安全性很重要,应该使用HTTPS来传输,避免被截获。
用户提供的代码中有使用Cookies存储token,这可能涉及到浏览器的同源策略,需要确保Cookie的domain设置正确,以便在不同子域之间共享。另外,token的过期时间也需要合理设置,并在前端处理过期后的重新认证流程。
最后,测试环节不可少,需要模拟多个系统之间的跳转和登录状态保持,确保用户在一个系统登录后,其他系统无需再次登录。同时,日志记录和错误处理也需要完善,便于排查问题。
总结下来,实现步骤大致分为前端API和状态管理、后端认证服务、Token管理、跨域处理以及测试验证。需要确保每一步都正确配置,并参考RuoYi框架已有的模块结构进行整合,避免冲突。</think>### RuoYi框架单点登录(SSO)实现方案
#### 一、实现原理
单点登录(SSO)的核心是通过统一认证中心管理多个子系统的登录状态,关键流程如下:
1. 用户访问子系统A时,若未登录则跳转至认证中心
2. 认证中心验证用户身份后生成全局$token$并返回给子系统A
3. 后续访问子系统B时,通过携带$token$自动完成认证[^1]
#### 二、前端实现步骤(Vue部分)
1. **添加SSO认证接口**
在`/src/api/login.js`中添加:
```javascript
// 单点登录认证
export function loginSso(queryParam) {
return request({
url: '/loginSso',
method: 'post',
params: queryParam
})
}
// Token校验接口
export function checkTicket(queryParam) {
return request({
url: '/checkTicket',
method: 'post',
params: queryParam
})
}
```
2. **Vuex状态管理改造**
修改`/src/store/modules/user.js`:
```javascript
actions: {
// 单点登录方法
LoginSso({ commit }, userInfo) {
const ticket = userInfo.ticket
return new Promise((resolve, reject) => {
loginSso({ ticket: ticket }).then(res => {
setToken(res.token)
commit('SET_TOKEN', res.token)
resolve()
}).catch(error => {
reject(error)
})
})
}
}
```
#### 三、后端实现步骤(Spring Boot部分)
1. **添加依赖配置**
在pom.xml中加入:
```xml
<!-- Spring Security OAuth2 -->
<dependency>
<groupId>org.springframework.security.oauth</groupId>
<artifactId>spring-security-oauth2</artifactId>
<version>2.5.2.RELEASE</version>
</dependency>
```
2. **Token校验接口实现**
```java
@PostMapping("/checkTicket")
public AjaxResult checkTicket(@RequestParam String ticket) {
// 实现示例:验证票据有效性
boolean isValid = redisTemplate.hasKey("SSO_TICKET:" + ticket);
return isValid ? AjaxResult.success() : AjaxResult.error("无效票据");
}
```
3. **配置跨域共享Cookie**
在application.yml中添加:
```yaml
session:
cookie:
name: SSO_SESSIONID
domain: .yourdomain.com # 统一主域
```
#### 四、核心流程时序
$$
\begin{aligned}
&\text{子系统A} \rightarrow \text{认证中心}: \text{重定向登录请求} \\
&\text{认证中心} \rightarrow \text{用户}: \text{展示登录页面} \\
&\text{用户} \rightarrow \text{认证中心}: \text{提交凭证} \\
&\text{认证中心} \rightarrow \text{子系统A}: \text{生成Token并重定向} \\
&\text{子系统A} \rightarrow \text{认证中心}: \text{验证Token有效性} \\
&\text{认证中心} \rightarrow \text{子系统A}: \text{返回用户信息} \\
&\text{子系统B访问时重复验证流程}
\end{aligned}
$$
#### 五、安全增强建议
1. 使用JWT令牌时,建议采用$RS256$非对称加密算法
2. 设置Token有效期应满足:
$$ T_{expire} \leq 3600s \quad \text{且} \quad T_{refresh} \geq 300s $$
3. 推荐使用Redis集群存储会话状态,保障高可用性[^2]
阅读全文
相关推荐


















