javaspringspring-mvcspring-security

Is there a way to access a PathVariable in a controller level @PreAuthorize annotation?


is there a way to access the httpRequest within a controller level @PreAuthorize annotation to obtain a PathVariable and use it for the expression inside the @PreAuthorize annotation?

I want to be able to do the following, where #somePathVariable would result in the actual value passed for the PathVariable:

@RequestMapping(value = "/{somePathVariable}/something")
@PreAuthorize("@someBean.test(#somePathVariable)")
public class SomeController { ... }

It also would be sufficient if i could access the HttpServletRequest and get the PathVariable manually.

Please note that this expression is at the controller level before answering. I'd appreciate any help!


Solution

  • So as @pvpkiran already commented. It's probably not possible to get the param the way i want. However his workaround with using a bean to access the PathVariables manually seems to work just fine.

    @Component
    @RequiredArgsConstructor
    public class RequestHelper {
        private final HttpServletRequest httpServletRequest;
    
        /* https://stackoverflow.com/questions/12249721/spring-mvc-3-how-to-get-path-variable-in-an-interceptor/23468496#23468496 */
        public Object getPathVariableByName(String name) {
            final Map pathVariables = (Map) httpServletRequest.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE);
            return pathVariables.get(name);
        }
    }
    

    and

    @RequestMapping(value = "/{somePathVariable}/something")
    @PreAuthorize("@someBean.test(@requestHelper.getPathVariableByName('somePathVariable'))")
    public class SomeController { ... }
    

    did the job. It's not perfect but it works. The other (prob. better) option is to use @PreAuthorize on method level.

    Thanks for your help!