我有一个基于Spring WebMVC和Spring Security的Web应用程序。我想在@Controller类的方法中使用带有SpEL的@PreAuthorize注释。这样的事情:
The response is invalid
但它不起作用。即使没有ADMIN,也会为所有用户调用methodController()方法。但是,该代码正常工作,方法仅适用于管理员:
@GetMapping(value= "/method")
public String exampleForMethodPreAuthorize() {
if(methodController()){
return "forMethodPreAuthorize";
}
else return null;
}
@PreAuthorize("hasRole('ADMIN')")
public final boolean methodController(){
return true;
}
我不明白是因为什么是错误?最后,我使用组件扫描来搜索控制器类和定义
@PreAuthorize("hasRole('ADMIN')")
@GetMapping(value= "/method")
public String exampleForMethodPreAuthorize() {
return "forMethodPreAuthorize";
}
在ServletContext xml配置中。
答案 0 :(得分:1)
直接从exampleForMethodPreAuthorize()调用methodController()时,如果不通过代理调用则调用。仅使用带注释的行为增强代理呼叫。
对此答案的肯定:https://stackoverflow.com/a/28168213/1849366。它还提出了两种解决方法。
选项1:将methodController()方法移动到另一个bean。
选项2:使用如下方法通过代理调用方法methodController()。
@GetMapping(value= "/method")
public String exampleForMethodPreAuthorize() {
if(context.getBean(MyController.class).methodController()){
return "forMethodPreAuthorize";
}
else return null;
}