Java 有没有办法访问控制器级别@PreAuthorize注释中的PathVariable?
是否有方法访问控制器级别@PreAuthorize注释内的httpRequest,以获取PathVariable并将其用于@PreAuthorize注释内的表达式 我希望能够执行以下操作,其中#somePathVariable将导致为PathVariable传递的实际值:Java 有没有办法访问控制器级别@PreAuthorize注释中的PathVariable?,java,spring,spring-mvc,spring-security,Java,Spring,Spring Mvc,Spring Security,是否有方法访问控制器级别@PreAuthorize注释内的httpRequest,以获取PathVariable并将其用于@PreAuthorize注释内的表达式 我希望能够执行以下操作,其中#somePathVariable将导致为PathVariable传递的实际值: @RequestMapping(value = "/{somePathVariable}/something") @PreAuthorize("@someBean.test(#somePathVariable)") publi
@RequestMapping(value = "/{somePathVariable}/something")
@PreAuthorize("@someBean.test(#somePathVariable)")
public class SomeController { ... }
如果我可以访问HttpServletRequest并手动获取PathVariable,也就足够了
请注意,在回答之前,此表达式位于控制器级别。我将感谢任何帮助 因此@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);
}
}
及
完成了任务。这不是完美的,但很有效。另一个(可能更好)选项是在方法级别使用@PreAuthorize
谢谢你的帮助 您可以将HttpServletRequest添加到控制器中的任何方法。不管你是否已经有另一个论点,Spring都会注入它。@pvpkiran,是的,但他不想这样做。他需要控制器级别的支持,而不是方法级别的支持。只是出于好奇,这些注释现在会发生什么?@M.Prokhorov我认为null立即传递给测试方法您最好的选择,可能唯一的选择是使用
RequestMappingHandlerMapping
。在某个类中自动关联,并创建方法来提取所需的信息。RequestMappingHandlerMapping包含有关rest端点映射的所有信息。
@RequestMapping(value = "/{somePathVariable}/something")
@PreAuthorize("@someBean.test(@requestHelper.getPathVariableByName('somePathVariable'))")
public class SomeController { ... }