¿Cómo puedo acceder a las reclamaciones JWT métodos de controlador de API utilizando Spring Webflux?

Alt-J:

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);
    }
}
Ken Chan

Me gustaría crear un personalizado Authenticationobjeto 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 Detailses un lugar bueno para almacenar.

Muchos incorporada AuthenticationProvidercreará una UserDetailsy almacenar a Principal. Eso significa que usted puede considerar simplemente crear un customsied UserDetailssi 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 AuthenticationProvidero Filteretc. El objetivo es acceder al HttpServletRequest, obtener JWT de la cabecera HTTP, analizar el JWT, instalar y configurar esta medida Authenticationobjeto y ponerlo en la SecurityContext:

SecurityContextHolder.getContext().setAuthentication(authenication);

Para acceder a este Authenticationobjeto 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);
    }

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=192376&siteId=1
Recomendado
Clasificación