有没有办法在控制器级别@PreAuthorize注释中访问PathVariable?

时间:2018-03-15 10:22:04

标签: java spring spring-mvc spring-security

有没有办法在控制器级@PreAuthorize注释中访问httpRequest以获取PathVariable并将其用于@PreAuthorize注释中的表达式?

我希望能够执行以下操作,其中#somePathVariable将导致为PathVariable传递实际值:

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

如果我可以访问HttpServletRequest并手动获取PathVariable就足够了。

请注意,此表达式在回答之前处于控制器级别。我很感激任何帮助!

1 个答案:

答案 0 :(得分:1)

所以@pvpkiran已经评论过了。可能不可能按照我想要的方式获得参数。但是,他使用bean手动访问PathVariables的解决方法似乎工作正常。

@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);
    }
}

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

完成了这项工作。它不完美,但它的工作原理。另一个(问题更好)选项是在方法级别使用@PreAuthorize。

感谢您的帮助!