java - 有没有办法在 Controller 级别 @PreAuthorize 注释中访问 PathVariable?

标签 java spring spring-mvc spring-security

有没有办法在 Controller 级别的@PreAuthorize 注释中访问 httpRequest 以获得 PathVariable 并将其用于 @PreAuthorize 注释中的表达式?

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

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

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

请注意,在回答之前,此表达式处于 Controller 级别。如果有任何帮助,我将不胜感激!

最佳答案

正如@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。

感谢您的帮助!

关于java - 有没有办法在 Controller 级别 @PreAuthorize 注释中访问 PathVariable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49296908/

相关文章:

java - 使用 Spring 3.1 使用外部 Web 服务

spring - spring 如何在freemarker模板中获取请求上下文

java - 如何在 Drools 中处理动态 Json/类?

java - 通过 Eclipse 的 Maven Web 项目

java - number 不能包裹在 flyingsaucer 和 itext 中

Java Swing,可滚动的 HBox

java - 如何避免在服务类中重复 DAO 方法? @Transactional 注释 DAO 和服务类 - 这是可以接受的做法吗?

java - Querydsl - 线程 "main"java.lang.IllegalArgumentException : No sources given 中的异常

java - 如何使 @SpringBootApplication(scanBasePackages...) 提供详细的跟踪输出?

java - JPA + Hibernate + Spring + OneToMany 删除级联