RuoYi-Vue-fast单点登录实现:CAS与OAuth2.0集成方案

RuoYi-Vue-fast单点登录实现:CAS与OAuth2.0集成方案

【免费下载链接】RuoYi-Vue-fast :tada: (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue & Element 的前后端分离权限管理系统 【免费下载链接】RuoYi-Vue-fast 项目地址: https://gitcode.com/GitHub_Trending/ru/RuoYi-Vue-fast

在企业级应用中,单点登录(Single Sign-On, SSO)已成为多系统整合的核心需求。用户无需重复输入凭证,即可无缝访问多个关联系统,大幅提升操作效率与安全性。本文基于RuoYi-Vue-fast框架,详解如何通过CAS(Central Authentication Service)与OAuth2.0协议实现SSO集成,解决多系统间身份认证的痛点。

框架认证体系基础

RuoYi-Vue-fast默认采用JWT(JSON Web Token)实现无状态认证,其核心实现位于src/main/java/com/ruoyi/framework/security/service/TokenService.java。该类通过createToken方法生成令牌,结合Redis存储用户会话信息,实现分布式环境下的身份验证。

安全配置类src/main/java/com/ruoyi/framework/config/SecurityConfig.java定义了认证流程,通过JwtAuthenticationTokenFilter拦截请求并验证令牌有效性。系统默认禁用Session,采用SessionCreationPolicy.STATELESS策略,为SSO集成提供无状态基础。

CAS集成方案

集成架构设计

CAS集成采用"认证中心-服务提供者"模式,用户通过CAS Server完成身份验证后,获得CAS票据(Ticket),再通过票据访问RuoYi-Vue-fast系统。架构如下:

mermaid

核心实现步骤

  1. 添加CAS客户端依赖
    pom.xml中引入CAS客户端:

    <dependency>
        <groupId>org.jasig.cas.client</groupId>
        <artifactId>cas-client-core</artifactId>
        <version>3.6.4</version>
    </dependency>
    
  2. 配置CAS过滤器链
    创建CasConfig.java配置类,注册CAS认证过滤器:

    @Bean
    public FilterRegistrationBean<AuthenticationFilter> casAuthenticationFilter() {
        FilterRegistrationBean<AuthenticationFilter> registration = new FilterRegistrationBean<>();
        registration.setFilter(new AuthenticationFilter());
        registration.addUrlPatterns("/*");
        Map<String, String> initParams = new HashMap<>();
        initParams.put("casServerLoginUrl", "https://cas.example.com/login");
        initParams.put("serverName", "http://ruoyi.example.com");
        registration.setInitParameters(initParams);
        return registration;
    }
    
  3. 用户信息映射
    修改src/main/java/com/ruoyi/project/system/controller/SysLoginController.java,添加CAS票据验证接口,将CAS返回的用户信息转换为系统登录用户:

    @GetMapping("/cas/login")
    public String casLogin(String ticket) {
        // 验证ticket并获取用户信息
        String username = casService.validateTicket(ticket);
        // 生成JWT令牌
        LoginUser loginUser = userService.selectUserByUserName(username);
        String token = tokenService.createToken(loginUser);
        return "redirect:/index?token=" + token;
    }
    

OAuth2.0集成方案

适用场景与流程

OAuth2.0适用于第三方应用授权场景(如微信登录、企业微信集成)。RuoYi-Vue-fast作为资源服务器,通过接入OAuth2.0认证服务器实现用户身份验证。授权码流程如下:

mermaid

关键实现代码

  1. 配置OAuth2资源服务器
    修改SecurityConfig.java,添加OAuth2资源服务器配置:

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.oauth2ResourceServer()
            .jwt()
            .jwtAuthenticationConverter(jwtAuthenticationConverter());
    }
    
    private Converter<Jwt, AbstractAuthenticationToken> jwtAuthenticationConverter() {
        JwtAuthenticationConverter converter = new JwtAuthenticationConverter();
        converter.setJwtGrantedAuthoritiesConverter(jwt -> {
            List<String> roles = jwt.getClaimAsStringList("roles");
            return roles.stream()
                .map(role -> new SimpleGrantedAuthority("ROLE_" + role))
                .collect(Collectors.toList());
        });
        return converter;
    }
    
  2. 实现OAuth2登录接口
    SysLoginController.java中添加OAuth2登录端点:

    @GetMapping("/oauth2/login")
    public AjaxResult oauth2Login(@RequestParam String code) {
        // 调用认证服务器换取token
        OAuth2Token token = oauth2Service.getToken(code);
        // 获取用户信息
        OAuth2UserInfo userInfo = oauth2Service.getUserInfo(token.getAccessToken());
        // 生成系统令牌
        LoginUser loginUser = userService.selectUserByUserName(userInfo.getUsername());
        String jwtToken = tokenService.createToken(loginUser);
        return AjaxResult.success().put("token", jwtToken);
    }
    

多协议整合与扩展

动态认证路由设计

为支持CAS与OAuth2.0并存,可通过请求参数动态选择认证方式。修改SecurityConfig.java,配置动态忽略URL:

@Override
public void configure(WebSecurity web) throws Exception {
    web.ignoring().antMatchers("/cas/login", "/oauth2/login");
}

会话管理增强

通过src/main/java/com/ruoyi/project/monitor/controller/SysUserOnlineController.java提供的在线用户管理功能,可监控SSO登录用户状态,实现强制登出等操作。关键代码如下:

@DeleteMapping("/{tokenId}")
public AjaxResult forceLogout(@PathVariable String tokenId) {
    redisCache.deleteObject(CacheConstants.LOGIN_TOKEN_KEY + tokenId);
    return AjaxResult.success();
}

部署与测试建议

环境配置要点

  1. CAS Server部署
    推荐使用CAS 6.x版本,配置HTTPS确保传输安全。修改cas.properties

    server.ssl.key-store=file:/etc/cas/keystore.jks
    server.ssl.key-store-password=changeit
    
  2. OAuth2服务配置
    确保授权服务器与RuoYi-Vue-fast的token.secret一致,避免签名验证失败。配置文件路径:src/main/resources/application.yml

测试流程

  1. CAS集成测试

    • 访问http://ruoyi.example.com/cas/login
    • 被重定向至CAS登录页
    • 输入凭证后跳转回系统并自动登录
  2. OAuth2集成测试

    • 访问http://ruoyi.example.com/oauth2/login?provider=wechat
    • 完成第三方授权后返回系统

总结与展望

本文详细介绍了RuoYi-Vue-fast集成CAS与OAuth2.0的实施方案,通过扩展框架的认证链与令牌生成机制,实现了多系统统一身份认证。企业可根据实际场景选择合适协议:CAS适用于内部系统整合,OAuth2.0更适合第三方应用接入。

后续可进一步探索:

  • 基于SAML2.0的跨域认证
  • 多因素认证(MFA)集成
  • 认证日志审计与异常检测

官方文档:doc/若依环境使用手册.docx
核心安全模块:src/main/java/com/ruoyi/framework/security/
令牌服务实现:src/main/java/com/ruoyi/framework/security/service/TokenService.java

【免费下载链接】RuoYi-Vue-fast :tada: (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue & Element 的前后端分离权限管理系统 【免费下载链接】RuoYi-Vue-fast 项目地址: https://gitcode.com/GitHub_Trending/ru/RuoYi-Vue-fast

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值