Я пытаюсь настроить иерархические роли в моем приложении Spring Boot без успеха. Я сделал все, что было сказано в разных местах в Интернете. Но ни один из них не смог решить проблему.Spring Boot + Spring Security + Иерархические роли
Вот код моего класса SecurityConfig. Когда я вхожу в приложение с пользователем с ROLE_ADMIN, он должен иметь возможность извлекать данные из «/ users», но в настоящее время я получаю исключение, связанное с доступом. Если у пользователя есть учетные данные ROLE_USER, он работает нормально. Может ли кто-нибудь помочь мне понять, что не удается? Спасибо заранее.
@Configuration
@EnableWebMvcSecurity
@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private SigpaUserDetailsService userDetailsService;
@Bean
public RoleHierarchyImpl roleHierarchy() {
RoleHierarchyImpl roleHierarchy = new RoleHierarchyImpl();
roleHierarchy.setHierarchy("ROLE_ADMIN > ROLE_USER");
return roleHierarchy;
}
@Bean
public RoleHierarchyVoter roleVoter() {
return new RoleHierarchyVoter(roleHierarchy());
}
@Bean
public DefaultWebSecurityExpressionHandler expressionHandler(){
DefaultWebSecurityExpressionHandler expressionHandler = new DefaultWebSecurityExpressionHandler();
expressionHandler.setRoleHierarchy(roleHierarchy());
return expressionHandler;
}
@Bean
@SuppressWarnings(value = { "rawtypes" })
public AffirmativeBased accessDecisionManager() {
List<AccessDecisionVoter> decisionVoters = new ArrayList<AccessDecisionVoter>();
WebExpressionVoter webExpressionVoter = new WebExpressionVoter();
webExpressionVoter.setExpressionHandler(expressionHandler());
decisionVoters.add(webExpressionVoter);
decisionVoters.add(roleVoter());
return new AffirmativeBased(decisionVoters);
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.accessDecisionManager(accessDecisionManager())
.expressionHandler(expressionHandler())
.antMatchers("https://stackoverflow.com/users/**")
.access("hasRole('ROLE_USER')")
.anyRequest().authenticated();
http
.formLogin()
.loginPage("/login").permitAll()
.and()
.logout()
.permitAll();
}
@Override
protected void configure(AuthenticationManagerBuilder registry)
throws Exception {
registry.userDetailsService(userDetailsService);
}
}
Update: Вот код обновляется с вашим предложением, но по-прежнему не работает.
Это не работает. Я по-прежнему получаю то же исключение с правами доступа – Mario
@Mario Попробуйте мое обновление. – holmis83
Я сделал это уже вчера ... Я понятия не имею, почему это не работает, потому что я сделал все возможное без каких-либо успехов. – Mario