Resource Server
业务 API 使用 Spring Security 校验 JWT,按 Scope、角色或权限控制访问。
armorauth-spring-boot-starter 面向接入方 Spring Boot 服务,帮助业务服务校验访问令牌、
接入 OIDC 登录,并按标准 OAuth2/OIDC 与 ArmorAuth 交互。
Starter 是业务应用的接入包,不是授权服务器运行时。租户、用户、Client、MFA、JWK 和身份源仍由 ArmorAuth 服务端和管理台维护。
业务 API 使用 Spring Security 校验 JWT,按 Scope、角色或权限控制访问。
传统 Web 或 BFF 通过 Authorization Code 登录,用户身份由 ArmorAuth 托管。
当前用户解析、Admin API 调用和 Token Relay 应按业务边界显式接入和测试。
只在需要接入 ArmorAuth 的业务服务中添加 Starter。授权服务器自身不需要通过 Starter 启动。
<dependency>
<groupId>com.armorauth</groupId>
<artifactId>armorauth-spring-boot-starter</artifactId>
<version>1.0.0</version>
</dependency>
先在管理台创建应用,再把端点和 Client 配置写入业务服务。不同类型的业务系统不要共用同一个 Client。
| 场景 | 协议选择 | Spring Boot 接入点 |
|---|---|---|
| REST API | JWT Bearer Token,资源服务器验签。 | spring.security.oauth2.resourceserver.jwt.issuer-uri |
| Web / BFF | Authorization Code + Client Secret。 | spring.security.oauth2.client.registration |
| SPA / 移动端 | Authorization Code + PKCE,公共客户端。 | 前端或移动端 SDK 发起 PKCE,后端只做 API 资源服务器。 |
| 服务间调用 | Client Credentials,最小 Scope。 | 用 Spring OAuth2 Client 获取 Token,再调用下游 API。 |
| 设备登录 | Device Authorization Grant。 | 设备端请求 device code,用户在 ArmorAuth 激活页确认。 |
API 服务推荐只配置资源服务器。资源服务器通过 issuer 或 JWKS 验证访问令牌,再用 Scope、角色或权限做业务授权。
issuer-uri,让 Spring Security 自动读取 Discovery。spring:
security:
oauth2:
resourceserver:
jwt:
issuer-uri: http://localhost:9000
armorauth:
resource-server:
enabled: true
SecurityFilterChain,
避免登录页面、API 和静态资源的 matcher 相互覆盖。
传统 Web 服务或 BFF 可以作为 OAuth2 Client,通过 ArmorAuth 托管登录页完成认证,再在服务端维护会话。
spring:
security:
oauth2:
client:
registration:
armorauth:
client-id: dashboard
client-secret: ${ARMORAUTH_CLIENT_SECRET}
authorization-grant-type: authorization_code
client-authentication-method: client_secret_basic
scope: openid,profile,email
redirect-uri: "{baseUrl}/login/oauth2/code/{registrationId}"
provider:
armorauth:
issuer-uri: http://localhost:9000
OidcUser 或 OAuth2AuthenticationToken。业务服务通常需要把 JWT 或 OIDC 用户信息转换成自己的当前用户模型。推荐把 claim 映射集中封装,避免控制器重复解析 Token。
record CurrentUser(
String subject,
String username,
String tenantId,
List<String> roles,
List<String> scopes
) {}
| 字段 | 常见 Claim | 用途 |
|---|---|---|
| subject / username | sub, preferred_username | 当前登录用户 |
| tenantId | tenant_id | 租户感知业务隔离 |
| organizationIds | org_ids | 组织范围过滤 |
| roles / permissions | roles, permissions | 业务授权判断 |
| scopes | scope, scp | API 访问范围 |
内部自动化、批量开通和运维工具可以调用 ArmorAuth 管理 API。生产环境建议用独立服务账号、最小 Scope、超时、重试和错误映射。
RestClient adminClient = RestClient.builder()
.baseUrl("http://localhost:9000")
.defaultHeader(HttpHeaders.AUTHORIZATION, "Bearer " + adminToken)
.build();
Token Relay 适合 BFF 或网关把当前用户访问令牌转发给受信下游。它不等同于 OAuth2 Client 自动换取 Token, 也不应把用户 Token 发给第三方或未登记服务。
RestClient downstream = RestClient.builder()
.baseUrl("http://orders-service")
.requestInterceptor((request, body, execution) -> {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if (authentication instanceof JwtAuthenticationToken jwt) {
request.getHeaders().setBearerAuth(jwt.getToken().getTokenValue());
}
return execution.execute(request, body);
})
.build();
业务项目的安全边界往往不同,以下能力建议作为应用内配置或后续 starter 扩展点沉淀。
| 扩展方向 | 建议 |
|---|---|
| JWT 权限映射 | 同时覆盖 scope、scp、roles、permissions 和组织角色。 |
| 安全链共存 | Resource Server、OIDC Login、Actuator 和静态资源分别设置 matcher 与 order。 |
| Admin Client | 统一封装认证、超时、错误映射、审计字段和重试策略。 |
| 可观测性 | 记录 401/403、下游调用、token relay、身份源回调和管理 API 延迟。 |