Ich versuche, hierarchische Rollen in meiner Spring Boot-App ohne Erfolg einzurichten. Ich habe alles, was an verschiedenen Stellen im Internet gesagt wurde, getan. Aber mit keiner von ihnen konnte ich das Problem lösen.Spring Boot + Spring Security + Hierarchische Rollen
Hier ist der Code meiner SecurityConfig-Klasse. Wenn ich mich mit einem Benutzer mit ROLE_ADMIN in der App anmelde, sollte es in der Lage sein, Daten von '/ users' abzurufen, aber momentan erhalte ich eine Zugriff verweigert-Ausnahme. Wenn der Benutzer den ROLE_USER-Berechtigungsnachweis hat, funktioniert es einwandfrei. Kann mir jemand helfen, herauszufinden, was fehlschlägt? Vielen Dank im Voraus.
@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: Hier ist der Code mit Ihrem Vorschlag aktualisiert, aber immer noch nicht funktioniert.
Es funktioniert nicht so. Ich bekomme immer noch die gleiche Ausnahme für Zugriff verweigert – Mario
@Mario Versuchen Sie mein Update. – holmis83
Das habe ich gestern schon gemacht ... Ich habe keine Ahnung, warum es nicht funktioniert, weil ich alles ohne Erfolg getan habe. – Mario