1

我的控制器:

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

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

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

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

4

3 回答 3

2

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

Spring 代理机制 所以我们在特定情况下需要做的就是添加

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

到 app-servlet.xml

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

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

于 2013-08-02T16:11:32.767 回答
2

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

Spring Framework中applicationContext.xml和spring-servlet.xml的区别

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

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

于 2012-12-29T11:07:09.857 回答
1

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

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

您必须在调度程序的 xml 中包含此元素,而不是在应用程序的 xml中。
春季常见问题

于 2014-05-01T22:45:22.650 回答