Я занимаюсь разработкой приложения, в котором моим внутренним сервером является сервер ресурсов без сохранения состояния.Каждый полученный запрос должен содержать заголовок 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.