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 并返回给客