У меня есть простое приложение с весенней загрузкой с двумя службами - ui
и resource
.
Я пытаюсь настроить аутентификацию oauth2 + oidc, используя сервер uaa.
Когда я вхожу в сервис ui
, Spring Security создает результат аутентификации (в OidcAuthorizationCodeAuthenticationProvider), используя id_token
, и не содержит никаких областей, кроме openid
. Когда создается результат аутентификации, он содержит только одно право доступа - ROLE_USER
, поэтому нельзя использовать авторизацию на стороне клиента.
Можно ли переопределить OidcUserService
и добавить области полномочий пользователя из access_token для проверки доступа на стороне клиента?
@Override
public OidcUser loadUser(OidcUserRequest userRequest) throws OAuth2AuthenticationException {
OidcUser user = super.loadUser(userRequest);
Collection<? extends GrantedAuthority> authorities = buildAuthorities(
user,
userRequest.getAccessToken().getScopes()
);
return new DefaultOidcUser(
authorities,
userRequest.getIdToken(),
user.getUserInfo()
);
}
Конфигурация безопасности:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.mvcMatchers("/protected/**").hasAuthority("SCOPE_protected")
.anyRequest().authenticated()
.and()
.oauth2Login()
.userInfoEndpoint().oidcUserService(oidcUserService())
.and()
...
Это работает, но я не уверен, что это хорошая идея.