当前位置:首页 > Java

java如何实现单点登录

2026-01-16 15:40:52Java

单点登录(SSO)的基本概念

单点登录是一种用户认证机制,允许用户通过一次登录访问多个相互信任的应用系统。核心原理是通过共享认证状态(如Token或Cookie)实现跨系统身份验证。

基于Token的SSO实现方案

1. 认证中心(Auth Server)

  • 用户首次登录时,认证中心验证身份并生成Token(如JWT)。
  • Token包含用户信息、有效期及签名(防篡改)。
  • 示例JWT生成代码:
    String token = JWT.create()
      .withSubject("user123")
      .withExpiresAt(new Date(System.currentTimeMillis() + 3600_000))
      .sign(Algorithm.HMAC256("secret"));

2. 应用系统(Client)

  • 应用系统拦截未认证请求,重定向到认证中心。
  • 认证中心验证Token有效性后返回用户信息。
  • 示例Token验证代码:
    JWTVerifier verifier = JWT.require(Algorithm.HMAC256("secret")).build();
    DecodedJWT decoded = verifier.verify(token);
    String userId = decoded.getSubject();

基于Cookie的SSO实现方案

1. 共享Cookie域

  • 设置Cookie的Domain为父级域名(如.example.com),子域名可共享。
  • 示例设置Cookie代码:
    Cookie cookie = new Cookie("sso_token", token);
    cookie.setDomain(".example.com");
    cookie.setPath("/");
    response.addCookie(cookie);

2. 跨域认证

  • 若域名不同,通过认证中心中转(如OAuth 2.0)。
  • 用户访问应用A时,跳转至认证中心获取授权码,再交换Token。

使用Spring Security + OAuth2实现SSO

1. 认证中心配置

@Configuration
@EnableAuthorizationServer
public class AuthServerConfig extends AuthorizationServerConfigurerAdapter {
    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.inMemory()
            .withClient("client1")
            .secret("secret1")
            .authorizedGrantTypes("authorization_code", "refresh_token")
            .redirectUris("http://app1.com/login/oauth2/code/sso");
    }
}

2. 资源服务器配置

@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().anyRequest().authenticated();
    }
}

3. 客户端集成
application.properties中配置:

java如何实现单点登录

spring.security.oauth2.client.registration.sso.client-id=client1
spring.security.oauth2.client.registration.sso.client-secret=secret1
spring.security.oauth2.client.registration.sso.authorization-grant-type=authorization_code
spring.security.oauth2.client.registration.sso.redirect-uri=http://app1.com/login/oauth2/code/sso
spring.security.oauth2.client.provider.sso.issuer-uri=http://auth-server.com

安全注意事项

  • Token有效期:设置较短的过期时间,结合Refresh Token机制。
  • HTTPS:强制使用HTTPS传输Token/Cookie,防止中间人攻击。
  • 签名验证:JWT必须验证签名,避免伪造Token。

以上方案可根据实际需求选择,Token方案适合前后端分离,Cookie方案适合传统Web应用,OAuth2适合复杂跨域场景。

分享给朋友:

相关文章

vue如何实现排序

vue如何实现排序

实现数组排序 在Vue中可以通过计算属性或方法对数组进行排序。使用JavaScript的sort()方法结合Vue的响应式特性实现动态排序。 data() { return { item…

如何实现语音react

如何实现语音react

语音识别基础设置 在React中实现语音识别功能通常需要借助浏览器的Web Speech API或第三方库。Web Speech API提供了SpeechRecognition接口,允许应用程序直接访…

vue如何实现滚动

vue如何实现滚动

Vue 实现滚动的方法 使用原生滚动 在Vue中可以直接使用HTML原生滚动,通过CSS设置overflow: auto或overflow: scroll来实现滚动效果。适用于简单场景。 <d…

java是如何实现跨平台的

java是如何实现跨平台的

Java 跨平台的实现原理 Java 实现跨平台的核心机制基于 “一次编写,到处运行” 的理念,主要通过以下技术实现: 字节码与 JVM Java 源代码编译后生成字节码(.class 文件),而非…

vue权限如何实现

vue权限如何实现

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

vue如何实现定位

vue如何实现定位

Vue 实现定位的方法 在 Vue 中实现定位通常涉及 CSS 的定位属性(如 position: fixed、position: absolute 等)或结合浏览器 API(如 Geolocatio…