Yo estaba buscando la respuesta para un largo tiempo, pero no podía encontrar nada productivo

En mi servicio rest guardo algunas funciones bajo: /cuenta/{id}/descarga y me gustaría configurar el acces PAPEL en SecurityConfig archivo java, que sólo ROLE_TOKENSAVED los usuarios pueden acceder a esta url

¿Cómo debe el patrón parecer, cuando {id} es cambiante?

He probado algunos regexp patrones, pero nada funcionaba como yo quería, aquí están algunos de mis intentos:

1. antMatchers("account/**/download").access(somerolehere)
2. antMatchers("account/\d/download").access(somerolehere)
3. antMatchers("account/[\d]/download").access(somerolehere)

gracias de antemano por su anserwers 🙂

edición:

    @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...
    }
dónde están todos los comentarios?

OriginalEl autor azalut | 2014-12-25

2 Comentarios

  1. 25

    Esto funciona para mí:

    antMatchers("/account/{\d+}/download").access("hasAnyAuthority('ROLE_TOKENSAVED')")

    Aviso las llaves alrededor de la ruta de la variable que representa el ID.

    sí funcionó, pero sólo cuando les comente .antMatchers(“/cuenta*//**”).acceso(“hasRole(‘ROLE_USER’) o hasRole(‘ROLE_ADMIN’)”) patrón, ¿cómo conciliar estos dos patrones?
    Debido a que el comparador es más general. Los dispositivos de comparación deben ser ordenados de lo más específico a lo menos específico. Así que ponga el /account/{\\d+}/download combinador de antes.
    pero, ¿por qué he añadido entre llaves {} para el patrón? debido a que los controladores de uso: {id} patrón a tomar PathVariable de ella?
    Cuando usted mira la AntPathMatcher JavaDoc dice esto: “URI las variables de la plantilla se expresan a través de llaves (‘{‘ y ‘}’)”. Así que esto es sólo la sintaxis específica para Ant dispositivos de comparación.

    OriginalEl autor Bohuslav Burghardt

  2. 10

    A pesar de lo que Bohuslav sugieren que funciona, no es completa. Según la documentación de AntPathMarcher:
    http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/util/AntPathMatcher.html

    Es necesario especificar la ruta de acceso de la variable con el regex:

    {spring:[a-z]+} matches the regexp [a-z]+ as a path variable named "spring"

    Si no, puede exponer a otras rutas. Por ejemplo:

    http
    .authorizeRequests()
    .antMatchers(HttpMethod.GET, "/users/{^[\\d]$}").authenticated()
    .antMatchers("/users/**").hasAuthority("admin")

    y estos métodos en 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();
    }

    Porque no especifica la ruta de acceso de la variable, userId, los usuarios serán capaces de hacer una petición GET on “/usuarios/roles” sin tener el administrador de la autoridad. También otros futuros rutas como “usuarios/test” también serán expuestos incluso si el admin se requiere autorización. Para evitar que:

    antMatchers("/account/{accountId:[\\d+]}/download")
    .access("hasAnyAuthority('ROLE_TOKENSAVED')")

    si la ruta de acceso de la variable nombre era “accountId”

    OriginalEl autor LethalLima

Dejar respuesta

Please enter your comment!
Please enter your name here