Spring 安全性:@PreAuthorize 只能与@RequestMapping 一起使用

Spring Security: @PreAuthorize works only together with @RequestMapping

我有一个 Spring MVC 控制器,想用 Spring 方法安全性来保护它。

在下面的示例中 它有效 - @RequestMapping@PreAuthorize 注释相同的方法:

@Controller
public class MyController {

    @RequestMapping(value = "/test", method = {RequestMethod.POST, RequestMethod.GET})
    @PreAuthorize("isAuthenticated()")
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {  
        return test(request, response);
    }

    public ModelAndView test(HttpServletRequest request, HttpServletResponse response) throws Exception {
        ...
    }

在这个例子中它不起作用 - @RequestMapping@PreAuthorize注释不同的方法:

@Controller
public class MyController {

    @RequestMapping(value = "/test", method = {RequestMethod.POST, RequestMethod.GET})
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {  
        return test(request, response);
    }

    @PreAuthorize("isAuthenticated()")
    public ModelAndView test(HttpServletRequest request, HttpServletResponse response) throws Exception {
        ...
    }


这种奇怪行为的原因可能是什么?

在第二个示例中,test 方法直接从 handleRequest 方法调用。 Spring 没有机制来拦截来自同一个 class 中的方法调用。因此,@PreAutorize 的 Proxy / AOP 方法 inception 永远不会被调用。

More on the topic of Spring Proxy