【问题标题】:spring boot oauth2 roles filterspring boot oauth2 角色过滤器
【发布时间】:2018-03-14 23:20:24
【问题描述】:
我在 spring 配置服务器中使用 spring-cloud-security 和 @EnableOAuth2Sso 来配置 oauth2。在我的 oauth 提供者对用户进行身份验证后,我想验证用户是否具有正确的角色。我的第一个想法是我需要添加一个在 oAuth 身份验证之后运行的过滤器。我是否需要扩展 WebSecurityConfigurerAdapter 并添加过滤器?如果是这样,您能否提供如何执行此操作的示例代码?我已经进行了一些搜索,试图将其拼凑起来,但没有取得任何成功。
【问题讨论】:
标签:
spring
spring-boot
spring-security-oauth2
spring-cloud-config
【解决方案1】:
您可以在身份验证期间检查角色,并为此编写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);
}
【解决方案2】:
我按照this 教程中的描述实现了authoritiesExtractor 方法。这让我可以访问返回的 oAuth 信息,并允许我检查用户是否处于正确的角色。这似乎正在做我需要的。
我本来希望在 WebSecurityConfigurerAdapter.configure 和 hasAnyRole 中实现这一点,但我不知道该怎么做。