SSO单点登录

基本概念

什么是SSO

SSO(Single Sign-On)单点登录是一种身份验证和授权机制,允许用户在多个相关但独立的软件系统中使用单组凭据(如用户名和密码)进行登录。用户只需登录一次,就可以访问所有经过SSO集成的应用程序,而无需为每个应用程序单独进行认证。

组成部分以及对应功能

  1. 用户:用户是SSO系统的最终使用者,通过提供凭据(如用户名和密码)进行身份验证,并获得对系统资源的访问权限。
  2. 身份提供者(Identity Provider, IdP):身份提供者是SSO系统的核心组件,负责管理用户的身份标识信息和认证过程。用户通过向身份提供者提供凭据来验证其身份,并获得访问令牌。
  3. 服务提供者(Service Provider, SP):服务提供者是依赖SSO系统的应用程序或服务,它们依赖IdP来验证用户身份。SP接收从IdP颁发的令牌,并使用该令牌来授权用户访问其资源。
  4. 令牌:令牌是在用户登录成功后由IdP签发的安全凭证,用于在用户与不同SP之间传递身份信息。常见的令牌类型包括SAML(Security Assertion Markup Language)、OAuth(Open Authorization)和OpenID Connect等。
  5. 身份验证协议:SSO系统使用各种身份验证协议来实现用户的身份验证和授权。常见的身份验证协议包括SAML、OAuth、OpenID等。

整体流程案例

// 身份提供者(IdP)实现

@RestController
public class IdPController {

    @PostMapping("/login")
    public ResponseEntity<String> login(@RequestBody UserCredentials credentials) {
        // 验证用户凭据,如果验证通过,则生成JWT令牌
        if (authenticate(credentials.getUsername(), credentials.getPassword())) {
            String token = generateToken(credentials.getUsername());
            return ResponseEntity.ok(token);
        } else {
            return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();
        }
    }

    private boolean authenticate(String username, String password) {
        // 在这里执行用户认证逻辑,例如检查数据库中的用户名和密码
        // 如果验证通过返回true,否则返回false
    }

    private String generateToken(String username) {
        // 生成JWT令牌并返回
    }
}

// 服务提供者(SP)实现

@RestController
public class SPController {

    @GetMapping("/resource")
    public ResponseEntity<String> getResource(@RequestHeader("Authorization") String token) {
        if (validateToken(token)) {
            // 执行授权访问资源的逻辑
            return ResponseEntity.ok("Access Granted");
        } else {
            return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();
        }
    }

    private boolean validateToken(String token) {
        // 解析令牌,并验证其有效性
        // 如果令牌有效,返回true,否则返回false
    }
}