Перво-наперво, установите точку останова в вашем экстракторе. Ваш код вообще выполняется? Я бы установил точку останова здесь:
@Bean
public AuthoritiesExtractor userAuthorityExtractor() {
return new UserAuthorityExtractor();
}
Если это нет, тогда вам нужно выяснить, почему ваш боб не вызывается. Я бы удостоверился, что ваш SecurityConfig
действительно обнаружен компонентным сканером .
Что касается вашего контроллера.
В 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);
}