Je cherchais la réponse depuis longtemps mais je n'ai rien trouvé de productif
Dans mon service de repos, je garde certaines fonctionnalités sous:/account/{id}/download et je voudrais définir le ROLE d'accès dans SecurityConfig Java, que seuls les utilisateurs ROLE_TOKENSAVED peuvent accéder à cette url
À quoi devrait ressembler le modèle, lorsque {id} est modifiable?
J'ai essayé quelques schémas d'expression rationnelle, mais rien n'a fonctionné comme je le souhaitais, voici quelques-unes de mes tentatives:
1. antMatchers("account/**/download").access(somerolehere)
2. antMatchers("account/\\d/download").access(somerolehere)
3. antMatchers("account/[\\d]/download").access(somerolehere)
merci d'avance pour vos anserwers :)
modifier:
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/admin**").access("hasRole('ROLE_ADMIN')")
.antMatchers("/account*//**").access("hasRole('ROLE_USER') or hasRole('ROLE_ADMIN')")
.antMatchers("/account/\\d+/download").access("hasRole('ROLE_TOKENSAVED')")
.antMatchers("/user**").permitAll()
//othercode...
}
Cela fonctionne pour moi:
antMatchers("/account/{\\d+}/download").access("hasAnyAuthority('ROLE_TOKENSAVED')")
Notez les accolades autour de la variable de chemin d'accès représentant l'ID.
Bien que ce que Bohuslav suggère fonctionne, il n'est pas complet. Selon la documentation pour AntPathMarcher: http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/util/AntPathMatcher.html
Vous devez spécifier la variable de chemin avec l'expression régulière:
{spring:[a-z]+} matches the regexp [a-z]+ as a path variable named "spring"
Si vous ne le faites pas, vous pouvez exposer d'autres itinéraires. Par exemple:
http .authorizeRequests() .antMatchers(HttpMethod.GET, "/users/{^[\\d]$}").authenticated() .antMatchers("/users/**").hasAuthority("admin")
et ces méthodes sur un UserController:
@ResponseBody
@RequestMapping(value = "/users/{userId}", method = RequestMethod.GET)
public User getUser(@PathVariable("userId") Object id) {
return userService.getUserById(userId);
}
@ResponseBody
@RequestMapping(value = "/users/roles", method = RequestMethod.GET)
public List<String> getAllRoles() {
return userService.getAllRoles();
}
Parce que vous n'avez pas spécifié de variable de chemin, userId
, les utilisateurs pourront faire une demande GET sur "/ users/roles" sans avoir l'autorité d'administrateur. D'autres itinéraires à terme comme "/ users/test" seront également exposés, même si une autorisation administrateur est requise. Pour éviter cela:
antMatchers("/account/{accountId:[\\d+]}/download") .access("hasAnyAuthority('ROLE_TOKENSAVED')")
si le nom de votre variable de chemin était "accountId"