@PreAuthorize无法正常工作

时间:2012-12-29 10:44:55

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

我的控制器:

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

弹簧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" ...

即使重新部署应用程序,也始终会加载页面。我还没有登录。为什么它不会将其重定向到登录页面?

如果您需要更多信息,请随时提出。

3 个答案:

答案 0 :(得分:2)

控制器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中的bean根应用程序上下文。

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

答案 1 :(得分:2)

在实习期间我遇到了同样的问题。我和我的队友花了两天的时间来解决Spring Security源代码问题。然而,今天我们被告知,甚至没有看到任何例外的原因是“OP机制”,这是前面提到的。 原因是必须创建代理类。

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

<aop:config proxy-target-class="true" />

到app-servlet.xml

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

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

答案 2 :(得分:1)

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

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

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