Sto cercando di impostare i ruoli gerarchici nella mia app Spring Boot senza successo. Ho fatto tutto ciò che è stato detto in diversi posti su Internet. Ma con nessuno di loro sono stato in grado di risolvere il problema.Spring Boot + Spring Security + Hierarchical Roles
Ecco il codice della classe SecurityConfig. Quando accedo all'app con un utente con ROLE_ADMIN, dovrebbe essere in grado di recuperare i dati da "/ users", ma attualmente ricevo un'eccezione di accesso negata. Se l'utente ha le credenziali ROLE_USER, funziona correttamente. Qualcuno può aiutarmi a capire cosa sta fallendo? Grazie in anticipo.
@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);
}
}
Aggiornamento: Ecco il codice aggiornato con il tuo suggerimento, ma ancora non funziona.
Non funziona in questo modo. Ricevo ancora la stessa eccezione di Accesso negato – Mario
@Mario Prova il mio aggiornamento. – holmis83
L'ho già fatto ieri ... Non ho idea del perché non funzioni perché ho fatto tutto il possibile senza successo. – Mario