当前位置:首页 > Java

java如何实现单点登录

2026-02-04 12:46:31Java

单点登录(SSO)的基本原理

单点登录允许用户通过一次认证访问多个相互信任的应用系统。核心机制是认证中心(CAS Server)负责签发令牌(Token),应用系统(CAS Client)通过验证令牌实现免登录。

基于CAS协议的实现

CAS(Central Authentication Service)是常用的SSO开源协议,以下是Java实现步骤:

  1. 部署CAS Server

    • 使用官方提供的cas-overlay-template项目快速搭建认证中心。
    • 修改application.properties配置数据库、LDAP等认证源。
      # Maven依赖示例
      <dependency>
        <groupId>org.apereo.cas</groupId>
        <artifactId>cas-server-webapp</artifactId>
        <version>6.6.0</version>
      </dependency>
  2. 集成CAS Client

    • 在应用系统中添加CAS Client依赖,配置过滤器和回调地址。

      java如何实现单点登录

      // Spring Boot配置示例
      @Configuration
      public class CasConfig {
        @Value("${cas.server.url}")
        private String casServerUrl;
      
        @Bean
        public FilterRegistrationBean<AuthenticationFilter> casFilter() {
            FilterRegistrationBean<AuthenticationFilter> reg = new FilterRegistrationBean<>();
            reg.setFilter(new AuthenticationFilter());
            reg.addInitParameter("casServerLoginUrl", casServerUrl + "/login");
            reg.addInitParameter("serverName", "https://your-app.com");
            reg.addUrlPatterns("/*");
            return reg;
        }
      }

基于OAuth2/OpenID Connect的实现

适用于现代分布式架构,如Spring Security OAuth2:

  1. 搭建授权服务器

    • 使用spring-security-oauth2-authorization-server或Keycloak等第三方服务。
      @Bean
      public RegisteredClientRepository registeredClientRepository() {
        RegisteredClient client = RegisteredClient.withId("client1")
            .clientSecret("{noop}secret")
            .scope("read")
            .redirectUri("https://client-app.com/login/oauth2/code/custom")
            .build();
        return new InMemoryRegisteredClientRepository(client);
      }
  2. 资源服务器配置

    java如何实现单点登录

    • 在应用系统中验证JWT令牌并提取用户信息。
      @EnableWebSecurity
      public class SecurityConfig {
        @Bean
        SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
            http.oauth2ResourceServer(oauth2 -> oauth2.jwt(Customizer.withDefaults()));
            return http.build();
        }
      }

基于JWT的无状态SSO

适用于微服务场景,无需依赖会话存储:

  1. 生成和验证JWT

    • 使用jjwt库创建包含用户信息的令牌。
      String token = Jwts.builder()
        .setSubject("user1")
        .signWith(SignatureAlgorithm.HS256, "secret-key")
        .compact();
  2. 跨域共享Token

    • 通过Cookie或前端存储(如localStorage)传递JWT,各服务通过公钥验证签名。

注意事项

  • 安全性:所有通信需使用HTTPS,避免令牌泄露。
  • 令牌有效期:设置较短的JWT过期时间,结合Refresh Token机制。
  • 单点登出:CAS支持全局登出,OAuth2需依赖Token撤销接口。

参考实现可选择:

分享给朋友:

相关文章

js双击事件如何实现

js双击事件如何实现

实现双击事件的方法 在JavaScript中,可以通过监听dblclick事件或手动检测两次点击的时间间隔来实现双击事件。以下是几种常见的方法: 使用原生dblclick事件 element.add…

vue如何实现增删

vue如何实现增删

使用 Vue 实现增删功能 在 Vue 中实现增删功能通常涉及数据绑定、事件处理和列表渲染。以下是具体实现方法: 数据定义与初始化 在 Vue 组件的 data 选项中定义数组来存储需要操作的数据项…

vue如何实现tap

vue如何实现tap

Vue 中实现类似移动端 tap 事件的方法 在 Vue 中可以通过以下几种方式实现类似移动端 tap(轻触)事件的效果: 使用第三方库 安装 v-tap 指令库可以快速实现 tap 事件: np…

Java如何实现异步处理

Java如何实现异步处理

Java实现异步处理的常见方法 使用CompletableFuture CompletableFuture是Java 8引入的异步编程工具,支持链式调用和组合操作。 CompletableFutur…

vue框架如何实现

vue框架如何实现

Vue框架实现步骤 安装Vue.js 通过npm或CDN引入Vue.js,npm安装命令:npm install vue。CDN引入直接在HTML文件中添加Vue.js的script标签。 创建Vu…

vue权限如何实现

vue权限如何实现

Vue 权限实现方案 在 Vue 项目中实现权限控制通常涉及路由权限、按钮权限和接口权限三个方面。以下是具体实现方法: 路由权限控制 路由权限通常通过动态路由和全局路由守卫实现。用户登录后获取权限列…