Я использую spring-cloud-security и @ EnableOAuth2Sso на сервере конфигурации Spring для настройки oauth2. После того, как мой провайдер oauth аутентифицирует пользователя, я хочу проверить правильность роли пользователя. Моя первая мысль, что мне нужно добавить фильтр, который запускается после аутентификации oAuth. Нужно ли мне расширять WebSecurityConfigurerAdapter и добавлять фильтр? Если да, не могли бы вы предоставить образец кода, как это сделать? Я провел несколько поисков, пытаясь собрать это воедино, но безуспешно.
Вы можете проверить роли во время аутентификации и для этого написать собственную реализацию UserDetailsService. Это вызывается во время аутентификации DaoAuthenticationProvider для загрузки сведений о пользователе.
@Override
public UserDetails loadUserByUsername(final String username) throws UsernameNotFoundException {
final AbstractUser user = Optional.ofNullable((AbstractUser) userRepository.findUserByUsername(username)).orElseGet(() -> userTempRepository.findUserByUsername(username));
if (Objects.isNull(user)) {
throw new UsernameNotFoundException(String.format("Username \'%s\' not found.", username));
}
final boolean accountNonLocked = USER_STATUS_ACTIVE.equalsIgnoreCase(user.getStatus());
final List<GrantedAuthority> grantedAuthorities = user.getRoles() == null
? Collections.emptyList()
: user.getRoles().stream()
.map(SimpleGrantedAuthority::new)
.collect(Collectors.toList());
return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), true, true,
true, accountNonLocked, grantedAuthorities);
}
Я реализовал метод rulesExtractor, как описано в учебнике это. Это дало мне доступ к возвращенной информации oAuth и позволило мне проверить правильность роли пользователя. Кажется, это делает то, что мне нужно.
Я хотел бы реализовать это в WebSecurityConfigurerAdapter.configure с hasAnyRole, но я не мог понять, как это сделать.