前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >单点登录实现原理

单点登录实现原理

原创
作者头像
小马哥学JAVA
发布2024-07-04 09:07:32
1940
发布2024-07-04 09:07:32

单点登录(Single Sign-On,SSO)是一种用户认证方式,用户在多个应用系统中只需要登录一次,就可以访问所有相互信任的应用系统。SSO 的实现原理涉及身份认证、令牌管理、会话管理等多个方面,下面将详细介绍其实现原理和常用的实现方式。

SSO 实现原理

SSO 的核心思想是通过一个统一的认证系统来管理用户的登录状态,各个应用系统通过信任该认证系统来实现用户的单点登录。常见的实现原理如下:

  1. 用户请求登录
    • 用户访问应用系统 A,需要进行身份认证。
    • 应用系统 A 将用户重定向到 SSO 认证中心。
  2. 认证中心认证
    • 用户在 SSO 认证中心进行身份认证,如输入用户名和密码。
    • SSO 认证中心验证用户身份,通过后生成一个唯一的认证凭证(如 Token)。
  3. 回调应用系统
    • SSO 认证中心将认证凭证通过 URL 回调参数的方式传递给应用系统 A。
    • 应用系统 A 接收到认证凭证后,向 SSO 认证中心验证凭证的合法性。
  4. 建立会话
    • 验证通过后,应用系统 A 为用户建立会话(如生成 Session)。
    • 应用系统 A 在用户浏览器中设置一个会话 Cookie,标识用户已登录。
  5. 访问其他系统
    • 当用户访问应用系统 B 时,应用系统 B 检查用户是否已登录。
    • 如果用户未登录,应用系统 B 将用户重定向到 SSO 认证中心。
    • SSO 认证中心检测到用户已登录,直接返回认证凭证给应用系统 B。
    • 应用系统 B 验证凭证,通过后为用户建立会话。

常用的实现方式

1. 基于 Cookie 的 SSO
  • 原理:在 SSO 认证中心认证成功后,设置一个跨域的 Cookie,标识用户已登录。各应用系统通过读取该 Cookie 来判断用户是否已登录。
  • 实现难点:跨域 Cookie 的设置和读取,需要通过反向代理等方式解决跨域问题。
2. 基于 Token 的 SSO
  • 原理:在 SSO 认证中心认证成功后,生成一个 Token 并返回给应用系统。各应用系统通过 Token 向 SSO 认证中心验证用户身份。
  • 优点:不依赖浏览器的 Cookie,适用于跨域和分布式系统。
3. 基于 OAuth2 的 SSO
  • 原理:OAuth2 是一种授权协议,用于第三方应用系统访问资源所有者的资源。SSO 可以基于 OAuth2 实现,用户在认证中心完成认证后,认证中心颁发访问令牌(Access Token),各应用系统通过令牌调用认证中心的 API 验证用户身份。
  • 优点:标准化协议,支持多种认证方式和授权模式。

示例代码

以下是基于 Spring Security 和 OAuth2 实现 SSO 的示例代码:

SSO 认证中心

配置类

代码语言:javascript
复制
java复制代码@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {

    @Autowired
    private AuthenticationManager authenticationManager;

    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) {
        endpoints.authenticationManager(authenticationManager);
    }

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.inMemory()
               .withClient("client-id")
               .secret("client-secret")
               .authorizedGrantTypes("authorization_code", "refresh_token", "password")
               .scopes("all");
    }
}
应用系统

配置类

代码语言:javascript
复制
java复制代码@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .antMatchers("/public/**").permitAll()
            .anyRequest().authenticated();
    }
}

应用系统通过 Token 调用认证中心的 API 验证用户身份

代码语言:javascript
复制
java复制代码@RestController
public class UserController {

    @GetMapping("/user")
    public Principal user(Principal principal) {
        return principal;
    }
}

请求流程

  1. 用户访问应用系统
    • 用户访问应用系统的受保护资源,应用系统重定向到 SSO 认证中心。
  2. 用户认证
    • 用户在 SSO 认证中心进行身份认证,认证成功后,SSO 认证中心生成授权码(Authorization Code),并重定向回应用系统。
  3. 应用系统获取令牌
    • 应用系统使用授权码向 SSO 认证中心请求访问令牌(Access Token)。
    • SSO 认证中心验证授权码,生成访问令牌,并返回给应用系统。
  4. 应用系统验证用户身份
    • 应用系统使用访问令牌请求用户信息接口,获取用户身份信息,完成用户登录。

总结

单点登录(SSO)通过统一的认证中心管理用户的登录状态,各应用系统通过信任该认证中心,实现用户只需登录一次,即可访问所有相互信任的应用系统。常用的实现方式包括基于 Cookie、基于 Token 和基于 OAuth2 等。通过合理的设计和实现,可以提升用户体验,提高系统的安全性和可维护性。

我正在参与2024腾讯技术创作特训营最新征文,快来和我瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • SSO 实现原理
  • 常用的实现方式
    • 1. 基于 Cookie 的 SSO
      • 2. 基于 Token 的 SSO
        • 3. 基于 OAuth2 的 SSO
        • 示例代码
          • SSO 认证中心
            • 应用系统
            • 请求流程
            • 总结
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档