Estoy añadiendo un WebFilter para llevar a cabo la autenticación de JWT en el interior de SecurityWebFilterChain. Codificamos un montón de-auth no la información relacionada en la JWT que se necesita por muchos de nuestros criterios de valoración de la API, así que tengo que ser capaz de extraer información de la JWT y acceso a esa información en mis métodos de controlador de API (por ejemplo, LoginController. Java). ¿Cuál es el mejor patrón para lograr esto?
Aquí está mi SecurityWebFilterChain que muestra la autenticación WebFilter:
@Bean
public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) {
return http
.authorizeExchange()
.pathMatchers("/login", "/")
.authenticated()
.and()
.addFilterAt(basicAuthenticationFilter(), SecurityWebFiltersOrder.HTTP_BASIC)
.authorizeExchange()
.pathMatchers("/adm")
.authenticated()
.and()
.addFilterAt(basicAuthenticationFilter(), SecurityWebFiltersOrder.HTTP_BASIC)
.authorizeExchange()
.pathMatchers("/api/**")
.access(authorizationManager)
.and()
.addFilterAt(bearerAuthenticationFilter(), SecurityWebFiltersOrder.AUTHENTICATION)
.build();
}
Aquí es donde me gustaría tener acceso a las reclamaciones, en LoginController.java:
@RestController()
@RequestMapping(value = "/login")
public class LoginController {
private final UserMongoRepository repository;
@Autowired
public LoginController(UserMongoRepository repository) {
this.repository = repository;
}
@PostMapping("")
public Mono<User> login(@RequestBody User post,
@RequestParam String user_id,
@RequestParam String username) {
//Need to access information from JWT claims here
return this.repository.findById(user_id);
}
}
Me gustaría crear un personalizado Authentication
objeto y almacenar la información requerida dentro de él.
Para los datos relacionados con el usuario, almacenar dentro de su Principal
.Para los datos no relacionada con los usuarios, como sonidos Details
es un lugar bueno para almacenar.
Muchos incorporada AuthenticationProvider
creará una UserDetails
y almacenar a Principal
. Eso significa que usted puede considerar simplemente crear un customsied UserDetails
si está utilizando los construirse desde dentro AuthenticationProvider
.
Así que dependiendo de cómo se implementa la lógica de autenticación, es necesario personalizar el relacionado AuthenticationProvider
o Filter
etc. El objetivo es acceder al HttpServletRequest
, obtener JWT de la cabecera HTTP, analizar el JWT, instalar y configurar esta medida Authentication
objeto y ponerlo en la SecurityContext
:
SecurityContextHolder.getContext().setAuthentication(authenication);
Para acceder a este Authentication
objeto en el controlador, puede utilizar:
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
CurrentUser user = (CurrentUser) auth.getPrincipal();
CurrentRequestDetail detail= (CurrentRequestDetail) auth.getDetails();
/** CurrentUser and CurrentRequestDetail is the customised Principal and Details**/
Si necesita acceso [ Principal
] única, puede utilizar @AuthenticationPrincipal
:
@PostMapping("")
public Mono<User> login(@RequestBody User post,
@RequestParam String user_id,
@RequestParam String username,
@AuthenticationPrincipal CurrentUser currentUser) {
//Need to access information from JWT claims here
return this.repository.findById(user_id);
}