Я недавно писал проект весенней загрузки, который использует Spring Security oauth2, сервер аутентификации по какой-то причине - IdentityServer4, я могу успешно войти в систему и получить имя пользователя в моем проекте, но я не могу найти способ установить полномочия / роль пользователя.
request.isUserInRole всегда возвращает false.
@PreAuthorize ("hasRole ('rolename')") всегда приводит меня к 403.
Где я могу разместить код для установки полномочий?
Сервер возвратил некоторые пользовательские заявки через конечную точку userinfo, и мой проект получил их, и я даже могу увидеть это в основном параметре моего контроллера.
Этот метод всегда возвращает 403
@ResponseBody
@RequestMapping("admin")
@PreAuthorize("hasRole('admin')")
public String admin(HttpServletRequest request){
return "welcome, you are admin!" + request.isUserInRole("ROLE_admin");
}
application.properties
spring.security.oauth2.client.provider.test.issuer-uri = http://localhost:5000
spring.security.oauth2.client.provider.test.user-name-attribute = name
spring.security.oauth2.client.registration.test.client-id = java
spring.security.oauth2.client.registration.test.client-secret = secret
spring.security.oauth2.client.registration.test.authorization-grant-type = authorization_code
spring.security.oauth2.client.registration.test.scope = openid profile
Я печатаю претензии
@ResponseBody
@RequestMapping()
public Object index(Principal user){
OAuth2AuthenticationToken token = (OAuth2AuthenticationToken)user;
return token.getPrincipal().getAttributes();
}
и получите результат, показывающий, что есть утверждение с именем 'role'
{"key":"value","role":"admin","preferred_username":"bob"}
Кто-нибудь может мне помочь и дать решение, пожалуйста?
РЕДАКТИРОВАТЬ 1:
Причина в том, что клиент oauth2 удалил экстрактор, и мне нужно реализовать userAuthoritiesMapper.
Наконец я получил эту работу, добавив следующий класс:
@Configuration
public class AppConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.oauth2Login().userInfoEndpoint().userAuthoritiesMapper(this.userAuthoritiesMapper());
//.oidcUserService(this.oidcUserService());
super.configure(http);
}
private GrantedAuthoritiesMapper userAuthoritiesMapper() {
return (authorities) -> {
Set<GrantedAuthority> mappedAuthorities = new HashSet<>();
authorities.forEach(authority -> {
if (OidcUserAuthority.class.isInstance(authority)) {
OidcUserAuthority oidcUserAuthority = (OidcUserAuthority)authority;
OidcUserInfo userInfo = oidcUserAuthority.getUserInfo();
if (userInfo.containsClaim("role")){
String roleName = "ROLE_" + userInfo.getClaimAsString("role");
mappedAuthorities.add(new SimpleGrantedAuthority(roleName));
}
} else if (OAuth2UserAuthority.class.isInstance(authority)) {
OAuth2UserAuthority oauth2UserAuthority = (OAuth2UserAuthority)authority;
Map<String, Object> userAttributes = oauth2UserAuthority.getAttributes();
if (userAttributes.containsKey("role")){
String roleName = "ROLE_" + (String)userAttributes.get("role");
mappedAuthorities.add(new SimpleGrantedAuthority(roleName));
}
}
});
return mappedAuthorities;
};
}
}
Фреймворк меняется так быстро, и демоверсии в Интернете слишком старые!