gpt4 book ai didi

java - Spring Security中如何使用@PathVariable解析参数名?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:44:41 25 4
gpt4 key购买 nike

我想使用@PreAuthorize 注释来保护 Spring REST Controller 中的方法,使用方法参数,例如

@RequestMapping("/something/{myParam}")
@PreAuthorize("@security.check(#myParam)")
public String getSomething(@PathVariable("myParam") Integer myParam) {
//...
}

Spring Security 需要一种在运行时发现参数名称的方法。当编译类中没有调试符号时,需要添加一个特殊的注解@P或者Spring Data的@Param。因此,该方法将如下所示:

@RequestMapping("/something/{myParam}")
@PreAuthorize("@security.check(#myParam)")
public String getSomething(@PathVariable("myParam") @P("myParam) Integer myParam) {
//...
}

是否有可能以某种方式提示 Spring Security 改用 @PathVariable 并避免像 @P 这样的额外注释?

根据 the documentation从注解中读取参数名称是由 AnnotationParameterNameDiscoverer 完成的,它可以被自定义以支持任何指定注解的值属性。但是,我找不到任何关于如何进行的信息 对其进行自定义。

顺便说一句,我使用的是 Java 7 和 Spring Security 3.2.9。

最佳答案

简而言之,您需要覆盖 SecurityExpressionHandler 的创建在方法中GlobalMethodSecurityConfiguration#createExpressionHandler以便设置您自己的ParameterNameDiscoverer在自定义GlobalMethodSecurityConfiguration .

@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class MethodSecurityConfiguration extends GlobalMethodSecurityConfiguration {

@Autowired
private ApplicationContext context;

@Override
protected MethodSecurityExpressionHandler createExpressionHandler() {
DefaultMethodSecurityExpressionHandler result = new DefaultMethodSecurityExpressionHandler();
result.setApplicationContext(this.context);
result.setParameterNameDiscoverer(new AnnotationParameterNameDiscoverer(PathVariable.class.getName()));
return result;
}

}

sample project你可以在控制台输出中看到这样的结果

2016-06-06 17:09:01.635  INFO 2871 --- [nio-8080-exec-4] c.s.so.q37435824.SecurityService: myParam value from PathVariable equals 1

最好的问候

关于java - Spring Security中如何使用@PathVariable解析参数名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37435824/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com