【问题标题】:Principal not showing Authorities after implementing AuthoritiesExtractor实施 AuthoritiesExtractor 后主体未显示权限
【发布时间】:2019-06-06 13:50:25
【问题描述】:

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

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

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

@RestController
public class UserController {
@GetMapping("/me")
public Principal currentUser (Principal principal) {
return principal;
}

返回的对象不显示权限“MYROLE”。我错过了什么?

【问题讨论】:

  • 我遇到了类似的问题...在此处发布了我的解决方案 stackoverflow.com/questions/55894402/…。如果不是解决方案,我不想重复发布答案。让我知道这是否有帮助。

标签: spring-security


【解决方案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);
}

【讨论】:

  • 感谢您的回复。无论出于何种原因,SpringBoot 都没有调用我的提取器。我尝试将@Component 添加到我的提取器中,将其添加为代码中所示的 bean,添加 spring 安全库。但到目前为止没有任何帮助
  • 这取决于你的包结构。 Spring Boot 应用程序将自动扫描您的 @SpringBootApplication 类所在的包和子包。如果您的 SecurityConfig 不在此范围内,请尝试添加 @ComponentScan
  • 我在上面的答案中补充了一些关于 Spring Boot 和 @ComponentScan 的信息
  • 这是一个非常简单的项目。到目前为止,同一个包中的所有类。由于端点显示了我定义的限制,因此还选择了安全配置。例如,未经身份验证的用户无法访问 /me 端点。对于经过身份验证的用户,它工作正常。以下代码 sn-p public void configure(HttpSecurity http) throws Exception { http.authorizeRequests().antMatchers("/test").hasRole("arcsso.test") .antMatchers("/admin").hasRole("arcsso .admin") .antMatchers("/me").authenticated() .anyRequest() .permitAll() }
  • 代码有点难读。我会补充你的问题,也许链接到一个测试项目。有两部分需要到位 1. 请求需要包含令牌,以及 2. 需要解析令牌(配置令牌解析) 如果您发布一个小示例项目,我可以为您返工。
猜你喜欢
  • 2020-05-28
  • 1970-01-01
  • 2013-02-21
  • 1970-01-01
  • 2021-12-07
  • 2012-02-22
  • 2014-11-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多