Spring-Security 3/Spring MVC 和可怕的 @Secured/RequestMapping

2024-01-08

我在向控制器添加安全注释时遇到了很多问题。

事实证明让我的控制器实现一个InitializingBean 是个坏主意。

public class MyController implements InitializingBean {

    @Secured(value="ROLE_ADMIN")
    @RequestMapping(method = RequestMethod.GET, value = "/{id}/edit")
    public String getView(Model model, @PathVariable("id") long id) {
        return "some view";
    }
}

这失败了:

警告 PageNotFound:962 - 无映射 找到带有 URI[...] 的 HTTP 请求

删除 @Secured Annotation 是可行的,但显然我不想这样做。 在网上浪费了很多时间之后,我注意到工作控制器和非工作控制器之间的最后一个区别是它实现了 InitializingBean 接口。现在这就像一个魅力:

public class MyController{

    @Secured(value="ROLE_ADMIN")
    @RequestMapping(method = RequestMethod.GET, value = "/{id}/edit")
    public String getView(Model model, @PathVariable("id") long id) {
        return "some view";
    }
}

谁能帮助我理解这种行为?


发生这种情况的原因是,当使用 JDK 动态代理应用安全方面时,对注释的访问会丢失,当通知 bean 实现任何接口时,默认情况下会发生这种情况。

要解决这个问题,您应该告诉 Spring Security 仅应用基于目标类的代理,使用<global-method-security proxy-target-class = "true" ...> ... (<aop:config proxy-target-class = "true" />也有效)。

有关 AOP 代理的更多信息here http://static.springsource.org/spring/docs/3.0.0.RELEASE/spring-framework-reference/html/aop.html#aop-proxying.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring-Security 3/Spring MVC 和可怕的 @Secured/RequestMapping 的相关文章

随机推荐