我的控制器:
@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" ...
即使重新部署应用程序,也始终会加载页面。我还没有登录。为什么它不会将其重定向到登录页面?
如果您需要更多信息,请随时提出。
答案 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