Capa de seguridad
El arquetipo monta un único SecurityFilterChain con varios mecanismos de autenticación habilitables independientemente vía app.security.*. Cada request usa exactamente un mecanismo; si trae credenciales de varios a la vez, se rechaza con 401.
Mecanismos
| Mecanismo | Credencial | Cuándo |
|---|---|---|
|
Header |
Modo por defecto. Confía en la identidad ya validada por el API gateway aguas arriba. |
|
Header |
Validación local contra issuers configurados vía JWKS / OIDC discovery. |
Propiedades
app:
security:
pre-authenticated:
enabled: true # default
jwt:
enabled: false # default
issuers:
- issuer-uri: ...
audiences: [...]
tenant-claim: ... # opcional, por issuer
authorities-claim: ... # opcional, por issuer
unsigned: false # default
| Propiedad | Tipo | Significado |
|---|---|---|
|
boolean |
Activa |
|
boolean |
Activa el resource server OAuth2 sobre la |
|
URL |
URI del issuer; coincide con |
|
List<String> |
El token autentica si su claim |
|
String |
Nombre del claim del token a comparar con |
|
String |
Nombre del claim que produce las authorities para este issuer. Sin valor, Spring usa los defaults ( |
|
boolean |
Si |
Los nombres de los claims se configuran por issuer porque los IDPs no coinciden en convenciones: Keycloak usa realm_access.roles, Auth0 usa permissions, Azure AD usa roles o scp, Okta usa groups. Igual aplica al claim del tenant.
Cadena de filtros
Orden relevante (omitiendo filtros no involucrados en auth):
-
TenantContextFilter— corre antes que laSecurityFilterChain. ResuelveX-Tenant-Idy populaTenantContextHolder. -
CredentialAmbiguityFilter— activo solo cuando hay 2+ mecanismos habilitados. Cuenta credenciales presentes y rechaza con 401 si hay más de una. -
RequestHeaderAuthenticationFilter— activo sipre-authenticated.enabled=true. LeeX-User-Id. -
BearerTokenAuthenticationFilter— activo sijwt.enabled=true. LeeAuthorization: Bearer.
Validadores JWT
Cada issuer construye un DelegatingOAuth2TokenValidator<Jwt> con:
| Validador | Acción |
|---|---|
|
Verifica |
|
Verifica que |
|
Si |
|
Si |
Fallo en cualquier validador → JwtValidationException → 401.
Endpoint de diagnóstico
GET /v1/whoami (commons/adapter/in/web/WhoAmIController) devuelve la identidad resuelta. Sirve para verificar la cadena de auth end-to-end sin tocar un endpoint del dominio.
{
"subject": "user-42",
"mechanism": "jwt",
"authorities": ["admin"]
}
mechanism se infiere del subtipo concreto de Authentication: pre-authenticated, jwt, o unknown. Tenant no se expone — la identidad y el contexto multitenancy son conceptos separados.
Puntos de extensión
| Necesidad | Cómo |
|---|---|
Validar claims custom (p. ej. |
Implementar |
Mapeo claims → authorities no trivial (prefijos, lookup en BD, transformaciones) |
Reemplazar el |
Comparación de tenant con lógica adicional (transformar el claim antes de comparar) |
Reemplazar |
Issuer resolution dinámica (p. ej. por tenant) |
Reemplazar el |
Ver también
-
Como habilitar autenticación JWT — pasos para activar JWT.
-
Convenciones de la capa web — headers (X-Tenant-Id, etc.) que la capa de seguridad consume.