web-dev-qa-db-fra.com

Modèle de sécurité antMatchers Spring avec ID utilisateur URL modifiable

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...
    }
25
azalut

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.

29
Bohuslav Burghardt

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"

11
LethalLima