没有调用PrincipalExtractor和AuthoritiesExtractor

时间:2019-04-28 20:42:08

标签: spring-boot spring-security-oauth2

我有一个简单的OAuth2应用程序。我首先创建了一个扩展WebSecurityConfigurerAdapter的SecurityConfig,并使用@ EnableOAuth2Sso进行了注释。我还在控制器中创建了一个API,以测试身份验证是否有效。主体被注入到控制器中,并给出正确的名称。

我现在正在尝试通过实现AuthoritiesExtractor并将其创建为bean来向主体添加一些权限。我也对PrincipalExtractor进行了同样的检查,以查看它是否正常工作。从浏览器发出任何请求时都不会调用它们。

编辑:实际上,这仅是通过OIDC进行的身份验证,因此我的客户端和资源位于同一应用程序上。

//这是我的安全配置类。

@Configuration
@EnableOAuth2Sso
public class SecurityConfig extends WebSecurityConfigurerAdapter {

@Override
public void configure(HttpSecurity http) throws Exception {
     http
     .antMatcher("/**")
     .authorizeRequests()
       .antMatchers("/login**","/error**")
       .permitAll()
     .anyRequest()
       .authenticated();
}

@Bean
public PrincipalExtractor principalExtractor() {
    return map -> {
        System.out.println("Principal extracted.");
        User user = new User();
        user.setUsername((String)map.get("username"));
        return user;
    };
}

@Bean
public AuthoritiesExtractor authoritiesExtractor() {
    return new PrismAuthoritiesExtractor();
}
}

//这是我单独定义的AuthoritiesExtractor类,目的是检查这样做是否有效。

public class PrismAuthoritiesExtractor implements AuthoritiesExtractor {

@Override
public List<GrantedAuthority> extractAuthorities(Map<String, Object> map) {
    return AuthorityUtils.commaSeparatedStringToAuthorityList("AUTH1,AUTH2");
}
}

1 个答案:

答案 0 :(得分:1)

我为此苦了一段时间。之所以没有调用我的AuthoritiesExtractor bean是因为较新版本的Spring不使用spring oauth2自动配置,而AuthoritiesExtractor是oauth2自动配置方式来覆盖角色映射。

在当前版本的spring-security中,您可以使用delegation-based strategy with OAuth2UserService。文档中的样本应该足以帮助您入门。我正在使用Kotlin,因此我的示例可能对您不起作用。

还有GrantedAuthoritiesMapper,它应该更接近AuthoritiesExtractor方法。