在控制器方法中的方法上使用@PreAuthorize注释

时间:2018-01-23 21:23:00

标签: java spring spring-mvc spring-security

我有一个基于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配置中。

1 个答案:

答案 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;
}