Я ищу правильный способ добавить аутентификацию на основе ролей, когда я извлекаю роли из JWT.
В идеале я хотел бы извлечь роли из JWT после аутентификации. Это будет работать путем проверки веб-токена на наличие некоторых полей, связанных с ролями, которые мы получаем из нашей системы аутентификации, keycloak.
Мой вопрос: возможно ли добавить роли к запросу, а затем использовать конфигурацию http, чтобы потребовать одну из этих извлеченных ролей?
Ниже приведен соответствующий код, который поможет объяснить, что я делаю.
В моем WebSecurityConfigurer
я делаю токен доступа доступным для каждого запроса.
@Bean
@Scope(scopeName = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)
public AccessToken accessToken() {
try {
HttpServletRequest request =
((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes())
.getRequest();
return ((KeycloakSecurityContext) ((KeycloakAuthenticationToken) request
.getUserPrincipal())
.getCredentials()).getToken();
} catch (Exception exc) {
return null;
}
}
Затем я переопределяю некоторые настройки http в методе configure
.
http
// Disable session management
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
// Allow calls to OPTIONS
.authorizeRequests().antMatchers(HttpMethod.OPTIONS, "/**").permitAll()
.and()
// Authenticate every other call
.authorizeRequests().anyRequest().authenticated()
.and()
.csrf().disable();
В идеале я хотел бы добиться чего-то вроде:
http.antMatchers("/foo").hasRole("jwt_extracted_role")
В настоящее время я создаю пользовательские фильтры, которые извлекают роли из токена, а затем проверяют правильные роли, но это, возможно, более громоздко, чем должно быть.
Любые указатели на то, какие методы каких классов конфигурации я должен переопределить, чтобы извлечь роли из запроса и добавить их в запрос?