Ruoyi-Vue单点登录实战:如何5分钟搞定统一认证接入(附完整代码)
Ruoyi-Vue单点登录实战5分钟极速接入统一认证系统当企业信息化系统逐渐增多时每个系统独立的账号体系会让用户体验大打折扣。想象一下员工每天需要在8个不同系统间反复输入账号密码——这不仅降低效率还增加了密码泄露风险。而单点登录(SSO)技术正是解决这一痛点的利器。作为国内流行的前后端分离快速开发框架Ruoyi-Vue在企业级应用中广泛使用。但很多开发者在为其接入统一认证平台时常会遇到票据校验、状态维护等技术难题。本文将手把手带您完成从零到一的完整接入流程所有代码均可直接复用。1. 单点登录核心原理与架构设计单点登录的本质是一次认证全网通行。其核心流程可概括为用户访问子系统时系统检查本地会话状态若未登录重定向到认证中心认证中心验证用户身份后颁发令牌(Ticket)子系统通过令牌获取用户信息建立本地会话在Ruoyi-Vue架构中我们需要特别注意前后端分离带来的特殊处理组件职责关键改造点前端Vue票据解析/状态维护新增SSO登录页面/路由拦截后端Spring票据验证/令牌转换新增认证接口/Shiro配置调整认证中心统一身份验证需提供标准票据验证接口提示在实际企业环境中认证中心通常由运维团队统一维护开发人员只需关注子系统接入逻辑。2. 前端改造从零构建SSO登录流程2.1 创建专用登录组件在/src/views/下新建login-sso.vue这是处理自动登录的核心入口template div v-loadingloading/div /template script export default { data() { return { loading: false, redirect: undefined } }, created() { // 解析URL中的认证票据 const ticket this.$route.query.ticket if (!ticket) { window.location.replace(https://sso.yourcompany.com) } else { this.handleSsoLogin(ticket) } }, methods: { async handleSsoLogin(ticket) { this.loading true try { await this.$store.dispatch(LoginSso, { ticket }) const { code } await checkTicket({ ticket }) if (code 200) { this.$router.push(this.redirect || /) } } catch (error) { console.error(SSO登录失败, error) window.location.replace(https://sso.yourcompany.com) } finally { this.loading false } } } } /script2.2 关键配置调整路由白名单配置修改permission.js将SSO登录页加入免拦截列表const whiteList [/login, /login-sso]API接口扩展在login.js中新增SSO相关接口export function loginSso(params) { return request({ url: /loginSso, method: post, params }) } export function checkTicket(params) { return request({ url: /checkTicket, method: post, params }) }Vuex状态管理增强user.js中的actionsLoginSso({ commit }, userInfo) { return new Promise((resolve, reject) { loginSso(userInfo).then(res { commit(SET_TOKEN, res.token) resolve() }).catch(error { reject(error) }) }) }3. 后端改造构建安全的票据验证体系3.1 核心控制器实现创建LoginSsoController.java处理认证逻辑RestController public class LoginSsoController { private final String VALIDATE_URL https://sso.yourcompany.com/validate; PostMapping(/loginSso) public AjaxResult loginSso(String ticket) { JSONObject ssoRes validateTicket(ticket); if (ssoRes.getInteger(code) ! 200) { return AjaxResult.error(ssoRes.getString(msg)); } String username ssoRes.getJSONObject(result).getString(username); if (!userService.checkUserExist(username)) { return AjaxResult.error(用户不存在); } String token loginService.loginNoCaptcha(username, defaultPassword); return AjaxResult.success(登录成功).put(token, token); } private JSONObject validateTicket(String ticket) { String response HttpUtils.sendGet(VALIDATE_URL ?ticket ticket); return JSON.parseObject(response); } }3.2 关键服务增强在SysLoginService中添加免验证码登录方法public String loginNoCaptcha(String username, String password) { // 构建认证令牌 UsernamePasswordAuthenticationToken authenticationToken new UsernamePasswordAuthenticationToken(username, password); // 执行认证 Authentication authentication authenticationManager .authenticate(authenticationToken); // 生成JWT令牌 LoginUser loginUser (LoginUser) authentication.getPrincipal(); return tokenService.createToken(loginUser); }3.3 安全配置调整确保Shiro放行SSO相关接口filterChainDefinitionMap.put(/loginSso, anon); filterChainDefinitionMap.put(/checkTicket, anon);4. 生产环境进阶优化4.1 安全性增强措施票据时效性建议在验证票据时检查颁发时间通常票据有效期不超过30秒long issueTime ssoRes.getJSONObject(result).getLong(issueTime); if (System.currentTimeMillis() - issueTime 30000) { return AjaxResult.error(票据已过期); }令牌刷新机制前端可定时检查登录状态setInterval(() { checkTicket({ ticket: sessionStorage.ticket }).catch(() { window.location.replace(https://sso.yourcompany.com) }) }, 300000) // 每5分钟检查一次4.2 性能优化方案本地缓存用户信息首次验证后可将用户基本信息缓存到RedisredisTemplate.opsForValue().set( sso:user: username, ssoRes.getJSONObject(result).toString(), 5, TimeUnit.MINUTES);连接池配置优化HTTP工具类的连接管理RequestConfig config RequestConfig.custom() .setConnectTimeout(5000) .setSocketTimeout(5000) .build();4.3 异常处理最佳实践建议统一处理以下常见异常场景认证中心不可用503错误网络超时504错误票据格式非法400错误用户权限变更403错误可在前端统一拦截axios.interceptors.response.use(null, error { if (error.response.status 403) { window.location.replace(https://sso.yourcompany.com?error403) } return Promise.reject(error) })在实际项目部署中我们遇到过认证中心证书过期导致整个SSO体系瘫痪的情况。后来通过增加备用验证节点和证书自动监控机制解决了这个问题。这也提醒我们分布式系统的每个环节都需要考虑容错方案。