Spring Boot 单点登录 token 实现流程

1. 简介

单点登录(Single Sign-On,简称 SSO)是一种认证机制,允许用户使用一组凭证登录多个应用系统,而不需要在每个应用系统中单独进行登录验证。Spring Boot 是一个快速开发框架,可以简化 Spring 应用的搭建和开发过程。本文将介绍如何使用 Spring Boot 实现单点登录 token 功能。

2. 实现流程

下面是实现单点登录 token 的流程,可以用表格展示每个步骤和相关操作。

步骤 操作
1. 生成 token 使用某种算法生成 token,并将 token 保存到数据库中
2. 发送 token 将 token 返回给客户端,客户端保存 token
3. 校验 token 每次请求时,客户端将 token 发送给服务端,服务端校验 token 的有效性
4. 更新 token 如果 token 有效,服务端可以选择更新 token,将新的 token 返回给客户端

接下来,将分别介绍每个步骤需要做什么,以及相应的代码实现。

3. 代码实现

3.1 生成 token

在 Spring Boot 中可以使用 JWT(JSON Web Token)来生成 token。JWT 是一种开放标准(RFC 7519),定义了一种紧凑且自包含的方式,用于在各方之间安全地传输信息。以下是生成 token 的代码示例:

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

public class TokenUtils {

    private static final String SECRET_KEY = "secret";

    public static String generateToken(String username) {
        Claims claims = Jwts.claims().setSubject(username);
        String token = Jwts.builder()
                .setClaims(claims)
                .signWith(SignatureAlgorithm.HS256, SECRET_KEY)
                .compact();
        return token;
    }
}

上述代码中,使用 Jwts.builder() 创建一个 JWT 构造器,然后设置 token 的主题为用户名,使用 signWith() 方法设置签名算法和密钥,最后使用 compact() 方法生成 token。在实际应用中,密钥应该存储在安全的地方,这里简化处理,直接使用一个字符串表示。

3.2 发送 token

将生成的 token 发送给客户端,客户端可以将 token 存储在本地,以备后续请求时使用。以下是发送 token 的代码示例:

@RestController
public class TokenController {

    @Autowired
    private TokenUtils tokenUtils;

    @PostMapping("/login")
    public String login(@RequestParam String username, @RequestParam String password) {
        // 验证用户名和密码
        // ...

        // 生成 token
        String token = tokenUtils.generateToken(username);

        return token;
    }
}

上述代码中,使用 @PostMapping 注解将 /login 路径映射到 login() 方法,该方法接收用户名和密码作为参数。在实际应用中,需要实现验证用户名和密码的逻辑。然后调用 generateToken() 方法生成 token,并将 token 返回给客户端。

3.3 校验 token

在每次请求时,客户端将 token 发送给服务端,服务端需要校验 token 的有效性。以下是校验 token 的代码示例:

@RestController
public class UserController {

    @Autowired
    private TokenUtils tokenUtils;

    @GetMapping("/user")
    public String getUserInfo(@RequestHeader("Authorization") String token) {
        // 校验 token
        boolean valid = tokenUtils.validateToken(token);

        if (valid) {
            // 获取用户信息
            // ...
            return "User Info";
        } else {
            throw new RuntimeException("Invalid token");
        }
    }
}

上述代码中,使用 @GetMapping 注解将 /user 路径映射到 getUserInfo() 方法,该方法接收一个 Authorization 请求头,其中包含 token。在实际应用中,可以通过 tokenUtils.validateToken() 方法校验 token 的有效性。如果校验通过,可以获取用户信息并返回;否则,抛出异常。

3.4 更新 token

如果 token 有效且需要更新,服务端可以选择更新 token 并返回给客