【问题标题】:@PreAuthorize not working correctly@PreAuthorize 无法正常工作
【发布时间】:2012-12-14 09:22:42
【问题描述】:

我的控制器:

@RequestMapping("/createchar")
@PreAuthorize("hasRole('ROLE_USER')")
public String createCharacter(Map<String, Object> map, Principal principal) {

spring-security.xml

<global-method-security pre-post-annotations="enabled"
    proxy-target-class="true" />
...
<intercept-url pattern="/game*" access="ROLE_USER" />
    <form-login login-page="/account/login" ...

页面始终会被加载,即使在重新部署应用程序之后也是如此。我什至没有登录。为什么它不重定向到登录页面?

如果您需要更多信息,请随时询问。

【问题讨论】:

    标签: java spring spring-mvc spring-security pre-authentication


    【解决方案1】:

    控制器 bean 通常驻留在 servlet 上下文中,因此它们既不受 AOP 声明的影响,也不受根应用程序上下文中的 bean 后处理器的影响。

    Difference between applicationContext.xml and spring-servlet.xml in Spring Framework

    我认为代理控制器类不是一个好主意,请参阅Spring-MVC Problem using @Controller on controller implementing an interface - 所以我更愿意避免在控制器类上使用 AOP 以避免意外 - 并且只在服务/DAO bean 上使用它,即根中的 bean应用程序上下文。

    在这种情况下,您应该对网页使用拦截 url 方法。

    【讨论】:

    • @Jaanus 我真的希望它能澄清一点,如果您有任何进一步的问题,请随时提问
    【解决方案2】:

    在实习期间,我遇到了同样的问题。我和我的队友花了 2 天时间研究 Spring Security 源代码。但是,今天我们被告知,甚至没有看到任何异常的原因是前面提到的“OP机制”。 原因是必须创建代理类。

    Spring Proxy Mechanisms 所以我们在特定情况下需要做的就是添加

    &lt;aop:config proxy-target-class="true" /&gt;

    到 app-servlet.xml

    如果您尝试调试代码并寻找 Spring 调用的方法,您甚至可以解决类似的问题(因为真正的原因可能不同),但这对您的耐心来说是一个巨大的挑战。

    希望这会对您和其他人有所帮助。

    【讨论】:

    • 我希望我能多点赞,你为我们节省了很多时间
    【解决方案3】:

    我遇到了同样的问题。当我将以下元素从 applicationContext.xml 移动到 *-servlet.xml(我的调度程序的配置 xml)时,我的问题解决了。

    <security:global-method-security secured-annotations="enabled"/>
    

    您必须在调度程序的 xml 中包含此元素,而不是在应用程序的 xml 中
    Spring FAQ

    【讨论】:

      猜你喜欢
      • 2016-12-01
      • 1970-01-01
      • 2016-09-01
      • 2012-07-11
      • 2018-04-08
      • 2017-04-20
      • 2018-10-02
      • 2016-09-04
      • 2010-10-06
      相关资源
      最近更新 更多