主体在实施AuthoritiesExtractor后未显示任何权限

时间:2019-01-11 15:55:59

标签: spring-security

我正在扩展AuthoritiesExtractor。在我的实现中,我添加了一个称为“ MYROLE”的新权限。我已经在SecurityConfig.java中创建了一个bean(@Bean),如下所示,以初始化此提取器,如下所示。

woff2

我的控制器方法/ me返回如下所示的主体对象。

@Configuration
@EnableOAuth2Sso
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Bean
public AuthoritiesExtractor userAuthorityExtractor() {
return new UserAuthorityExtractor();
}  

返回的对象不显示权限“ MYROLE”。我想念什么?

1 个答案:

答案 0 :(得分:1)

首先,在提取器中设置一个断点。您的代码是否执行?我将在此处设置断点:

@Bean
public AuthoritiesExtractor userAuthorityExtractor() {
    return new UserAuthorityExtractor();
} 

如果不是,那么您需要弄清楚为什么没有调用bean。我会确保您的SecurityConfig实际上是由component scanner接走的。

关于您的控制器。

在Spring Security中,不能保证Principal对象也拥有权限。主体本身是一个非常简单的界面

/**
 * Returns the name of this principal.
 *
 * @return the name of this principal.
 */
public String getName();

所以您想要的是Authentication对象,因为该接口公开了getAuthorities

@RestController
public class UserController {

    @GetMapping("/me")
    public Principal currentUser (Authentication authentication) {
        //do what you need with authorities
        Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();
        return authentication.getPrincipal();
    }

您还可以查看默认实现

public List<GrantedAuthority> extractAuthorities(Map<String, Object> map) {
    String authorities = "ROLE_USER";
    if (map.containsKey("authorities")) {
        authorities = this.asAuthorities(map.get("authorities"));
    }

    return AuthorityUtils.commaSeparatedStringToAuthorityList(authorities);
}