当前位置:首页 > 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撤销接口。

参考实现可选择:

分享给朋友:

相关文章

vue如何实现id

vue如何实现id

在 Vue 中实现 ID 绑定 Vue 提供了多种方式为元素或组件绑定唯一的 ID,可以根据具体需求选择合适的方法。 方法一:使用 v-bind 绑定静态或动态 ID <template&g…

vue自动登录如何实现

vue自动登录如何实现

实现自动登录的基本思路 自动登录通常通过结合本地存储(如localStorage或cookie)和token验证机制实现。用户首次登录成功后,服务器返回的认证token会被保存在客户端,下次打开应用时…

vue实现单点

vue实现单点

Vue 实现单点登录(SSO)方案 单点登录(SSO)允许用户通过一次登录访问多个系统。以下是基于 Vue 的实现方案: 基于 OAuth2/OpenID Connect 的实现 使用 oidc-…

php如何实现静态化

php如何实现静态化

PHP 实现静态化的方法 使用 ob_start() 和 ob_get_contents() 利用 PHP 的输出缓冲功能捕获动态生成的页面内容,将其保存为静态文件。这种方法适用于内容不频繁变化的页面…

vue如何实现增删

vue如何实现增删

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

vue如何实现tap

vue如何实现tap

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