我正在扩展AuthoritiesExtractor。在我的实现中,我添加了一个称为“ MYROLE”的新权限。我已经在SecurityConfig.java中创建了一个bean(@Bean),如下所示,以初始化此提取器,如下所示。
woff2
我的控制器方法/ me返回如下所示的主体对象。
@Configuration
@EnableOAuth2Sso
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Bean
public AuthoritiesExtractor userAuthorityExtractor() {
return new UserAuthorityExtractor();
}
返回的对象不显示权限“ MYROLE”。我想念什么?
答案 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);
}