当前位置:首页 > 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如何实现重新实现主题

vue如何实现重新实现主题

动态主题切换的实现 在Vue中实现动态主题切换,通常需要结合CSS变量和状态管理。通过修改根元素的CSS变量值,可以全局改变应用的主题样式。 定义主题相关的CSS变量在根元素中: :root {…

vue如何实现放大缩小

vue如何实现放大缩小

Vue 实现放大缩小功能 在 Vue 中实现放大缩小功能可以通过多种方式实现,以下介绍几种常见的方法: 使用 CSS transform 缩放 通过绑定 CSS 的 transform: scale…

vue如何实现增删

vue如何实现增删

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

vue如何实现uuid

vue如何实现uuid

生成 UUID 的方法 在 Vue 中生成 UUID 可以通过第三方库或原生 JavaScript 实现。以下是几种常见方法: 使用 uuid 库 安装 uuid 库: npm install u…

vue框架如何实现

vue框架如何实现

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

vue如何实现筛选

vue如何实现筛选

在Vue中实现筛选功能 Vue提供了多种方式实现数据筛选,可以根据需求选择合适的方法。以下是几种常见的实现方式: 使用计算属性实现筛选 计算属性是Vue中实现筛选功能的推荐方式,它会自动缓存结果,…