Spring Authorization Server 
在微服务架构中,Spring Authorization Server 为构建统一的认证与授权服务提供了极大的便利。通过它,开发者可以快速实现 OAuth2 的认证服务、客户端、资源服务等功能,并结合 Spring Cloud Gateway 实现基于 OAuth2 的微服务权限控制。
Sentinel 等限流组件可以与 OAuth2 结合,用于保护认证服务的可用性。而 Seata 则在分布式事务管理中发挥重要作用,与 OAuth2 的认证授权互补,解决不同层面的系统挑战。
1 Spring Authorization Server:实现OAuth2认证服务 
Spring Authorization Server 是一个提供 OAuth 2.0 和 OpenID Connect (OIDC) 授权服务的框架,能够帮助开发者快速实现认证和授权功能。在电商平台或微服务架构中,认证服务是系统安全的核心,它确保用户或客户端能够在受限资源上进行访问。
- 依赖配置: 
 首先,在项目的- pom.xml或- build.gradle文件中添加 Spring Authorization Server 的依赖:xml- <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-oauth2-authorization-server</artifactId> </dependency>
- 配置 Authorization Server: 
 创建一个配置类,启用授权服务器功能:java- @Configuration @EnableAuthorizationServer public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter { // 配置客户端、token等相关信息 }
- 注册客户端: 
 配置客户端信息,设置- client_id、- client_secret等,用于认证授权流程。
- 测试授权流程: 
 使用工具如 Postman 模拟请求,测试- Authorization Code、- Password等 OAuth 2.0 授权模式。
2 Spring Authorization Server:实现自定义JWT中内容及异常响应 
在 OAuth 2.0 中,JWT(JSON Web Token)用于在客户端和服务器之间安全地传递信息。开发者可以根据业务需求对 JWT 进行自定义,例如向 JWT 中添加用户角色、权限等额外信息。
2.1 自定义 JWT 内容 
- 自定义 JWT 生成器: 
 使用- JwtCustomizer或- JwtEncoder自定义 JWT 中的 Claims。java- public class CustomJwtTokenEnhancer implements JwtCustomizer { @Override public void customize(JwtEncodingContext context) { context.getClaims().claim("custom-claim", "custom-value"); } }
- 配置 JWT 签名与加密: 
 配置 JWT 的签名算法和密钥,确保 JWT 在生成和验证时的一致性。
2.2 自定义异常响应 
自定义认证和授权过程中的异常响应,返回符合业务需求的错误信息。
public class CustomAuthenticationEntryPoint implements AuthenticationEntryPoint {
   @Override
   public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) {
       response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
       response.getWriter().write("Custom error message");
   }
}3 Spring Authorization Server:实现OAuth2客户端 
OAuth2 客户端允许应用程序通过授权服务器获取访问令牌,从而访问受保护的资源。
- 依赖配置: 
 添加 Spring Security OAuth2 客户端的依赖:xml- <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-oauth2-client</artifactId> </dependency>
- 配置 OAuth2 客户端: 
 在- application.yml或- application.properties中配置 OAuth2 客户端的基本信息,包括- client_id、- client_secret和- authorization-uri。yaml- spring: security: oauth2: client: registration: my-client: client-id: your-client-id client-secret: your-client-secret authorization-grant-type: authorization_code redirect-uri: "{baseUrl}/login/oauth2/code/{registrationId}"
- OAuth2 登录流程: 
 使用 Spring Security 提供的 OAuth2 客户端登录功能:java- @GetMapping("/login/oauth2/code/{registrationId}") public String oauth2Login(@RequestParam String code) { // 使用授权码获取 token }
4 Spring Authorization Server:实现OAuth2资源服务 
资源服务是指受 OAuth2 授权保护的 API 服务,只有经过认证的客户端才能访问。
- 依赖配置: 
 添加资源服务的依赖:xml- <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-oauth2-resource-server</artifactId> </dependency>
- 配置资源服务: 
 在- application.yml中指定 JWT 解码的配置,确保资源服务能够正确验证客户端的 JWT:yaml- spring: security: oauth2: resourceserver: jwt: issuer-uri: https://your-authorization-server
- 资源服务保护: 
 在控制器中使用安全注解或配置类保护受 OAuth2 保护的资源:java- @RestController public class ProtectedController { @PreAuthorize("hasAuthority('SCOPE_read')") @GetMapping("/protected-resource") public String getProtectedResource() { return "This is a protected resource"; } }
5 Spring Authorization Server:基于Gateway和OAuth2的微服务权限解决方案 
在微服务架构中,使用 API Gateway 作为统一入口,通过 OAuth2 和 JWT 来实现对各微服务的权限控制是一种常见的方案。
- 配置 Gateway 与 OAuth2 集成: 
 使用 Spring Cloud Gateway 和 Spring Security OAuth2 来保护网关层,通过 JWT 解析访问请求。yaml- spring: cloud: gateway: routes: - id: secured-route uri: http://microservice-url predicates: - Path=/api/** filters: - StripPrefix=1 - TokenRelay
- OAuth2 鉴权与 JWT 校验: 
 在网关中配置- TokenRelay过滤器,确保请求中的 JWT 能正确传递到下游微服务。同时在下游微服务中校验 JWT,确定用户权限。
- 微服务权限控制: 
 在每个微服务中,根据用户的角色、权限信息进行授权控制。例如:java- @PreAuthorize("hasRole('ADMIN')") @GetMapping("/admin-resource") public String adminResource() { return "This is an admin resource"; }
- 集中式认证与分布式授权: 
 API Gateway 负责集中管理认证逻辑,OAuth2 认证服务器提供集中式的授权和 token 颁发,下游的微服务根据 JWT 进行分布式的权限验证。