Как отредактировать информацию о роли и имени принципала в приложении Spring WebFlux, работающем как OAuth2 Resource Server? - PullRequest
1 голос
/ 07 апреля 2019

Я занимаюсь разработкой приложения, в котором моим внутренним сервером является сервер ресурсов без сохранения состояния.Каждый полученный запрос должен содержать заголовок Authentication с маркером JWT Bearer - в настоящее время это Google id_token.Я могу проверить токен, но для обеспечения безопасности на уровне метода мне нужно иметь возможность установить роль и имя принципала с помощью информации из хранилища / службы.Как я могу установить роль и имя участника?

Следуя учебному пособию по Spring, я пытаюсь определить bean-компонент UserDetailsService для установки информации, но он не вызывается.Я добавил точку останова в методе findByUsername, но выполнение никогда не останавливается там.

application.yml file

spring:
  security:
    oauth2:
      resourceserver:
        jwt:
          issuer-uri: https://accounts.google.com

Config.java file:

@EnableWebFluxSecurity
@EnableReactiveMethodSecurity
public class SecurityConfig {

    @Bean
    SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) throws Exception {
        http
                .authorizeExchange()
                .pathMatchers("/**")
                .authenticated()
        .and()
                .oauth2ResourceServer()
                .jwt();
        return http.build();
    }

    // Using MapReactiveUserDetailsService, but I'll create my custom UserDetailsService implementation
    @Bean
    public MapReactiveUserDetailsService userDetailsService() {
        User.UserBuilder userBuilder = User.withDefaultPasswordEncoder();
        UserDetails rob = userBuilder.username("rob") //Instead of 'rob' and 'admin' I have in my code the Google ID of the Google accounts that I'm using to create the token
                .password("rob")
                .roles("USER")
                .build();
        UserDetails admin = userBuilder.username("admin") 
                .password("admin")
                .roles("USER","ADMIN")
                .build();
        return new MapReactiveUserDetailsService(rob, admin);
    }

SecuredController.java file:

@RestController
public class SecuredController {
    @GetMapping("/secured")
    @PreAuthorize("hasRole('ADMIN')")
    public Mono<Principal> secured(Principal principal) {
        return Mono.just(principal);
    }
}

При такой конфигурации не вызывается служба сведений о пользователе, и я не могудостичь конечной точки GET /secured.Я хотел бы достичь этого, используя пользователя с ролью ADMIN.

...