1. JWT(JSON Web Token)鉴权
JWT是一种自包含的Token类型,因其简洁、自包含和易于传输的特点,在微服务鉴权中广泛使用。JWT包含头部、负载和签名三部分,头部定义了签名算法,负载部分包含了用户信息和权限信息,签名部分则用于验证Token的完整性和真实性。
优点
- 自包含性:无需查询数据库即可获取用户信息。
- 签名机制:防止Token被篡改。
- 易于传输:结构紧凑,可以嵌入HTTP头部。
实战示例
使用Java和JWT库生成和验证Token:
java复制代码 import com.auth0.jwt.JWT; import com.auth0.jwt.algorithms.Algorithm; public class JwtUtil { public static String createJwtToken(String username) { Algorithm algorithm = Algorithm.HMAC256("secret"); return JWT.create() .withIssuer("myapp") .withClaim("username", username) .sign(algorithm); } public static void verifyJwtToken(String token) { Algorithm algorithm = Algorithm.HMAC256("secret"); JWTVerifier verifier = JWT.require(algorithm).withIssuer("myapp").build(); try { DecodedJWT jwt = verifier.verify(token); String username = jwt.getClaim("username").asString(); System.out.println("Authenticated user: " + username); } catch (JWTVerificationException e) { System.out.println("Invalid token"); } } }
2. OAuth 2.0鉴权
OAuth 2.0提供了一种标准的授权框架,适用于多服务、多客户端场景。它包含授权令牌和刷新令牌两种类型,授权令牌用于短期鉴权,刷新令牌用于获取新的授权令牌。
优点
- 标准化:广泛接受的标准。
- 令牌生命周期管理:授权令牌短期有效,刷新令牌用于续期。
- 灵活性:可与第三方授权服务集成。
实战示例
在Spring Security中集成OAuth 2.0:
java复制代码 import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.oauth2Login() .and() .authorizeRequests() .anyRequest().authenticated(); } }
3. 自定义Token鉴权
对于特定业务需求,可以设计自定义Token结构,包括用户信息、权限等。这种方式灵活性高,但需要自行实现Token的生成和验证机制。
优点
- 灵活性:可根据业务需求自由设计Token结构。
- 安全性:自行控制Token的生成和验证过程。
实战示例
生成和验证自定义Token:
java复制代码 public String createCustomToken(String userId, String role) { String token = userId + "|" + role + "|" + System.currentTimeMillis(); return Base64.getEncoder().encodeToString(token.getBytes()); } public boolean verifyCustomToken(String token) { String decodedToken = new String(Base64.getDecoder().decode(token)); String[] parts = decodedToken.split("\\|"); if (parts.length == 3) { // 验证逻辑 return true; } return false; }
4. 网关统一鉴权
在微服务架构中,通常使用网关(如Spring Cloud Gateway)进行统一鉴权。这种方式可以集中管理鉴权逻辑,减少代码冗余,提高安全性。
优点
- 集中管理:简化鉴权逻辑的管理。
- 提高安全性:减少Token在微服务间的传递。
实战示例
在Spring Cloud Gateway中集成Sa-Token实现无感鉴权:
java复制代码 @Bean public RouteLocator customRouteLocator(RouteLocatorBuilder builder) { return builder.routes() .route