【发布时间】:2012-02-06 02:45:42
【问题描述】:
我正在制作一个带有一些 RESTfull 资源作为 API 的 Spring MVC Web 应用程序。
我需要 RESTfull 部分来拥有一些自定义过滤器,因为我不想要任何重定向,并且我希望使用相应的 HTTP 错误代码和基本 JSON 描述来翻译任何异常。
另一方面,网站的其余部分必须更常见,并在人们未登录时重定向等。
还有一件事,我希望在某些情况下使用@Secured 注释和后验证。
如何正确定义多个 http 命名空间(在 Spring 3.1 上)?
这是我的错误配置:
<global-method-security secured-annotations="enabled" />
<http pattern="/rest/**" authentication-manager-ref="authenticationManager" entry-point-ref="restAuthenticationEntryPoint">
<form-login login-page="/rest/login" login-processing-url="/rest/postlogin"
authentication-success-handler-ref="restAuthenticationSuccessHandler"
authentication-failure-handler-ref="restAuthenticationFailureHandler"
username-parameter="username" password-parameter="password" />
<logout logout-url="/rest/logout" invalidate-session="true" />
</http>
<http pattern="/**" authentication-manager-ref="authenticationManager">
<form-login login-page="/login" login-processing-url="/postlogin"
username-parameter="username" password-parameter="password" />
<logout />
</http>
有趣的是,这个配置部分起作用,因为我可以使用 /rest/login 登录,并且我从我的自定义成功处理程序中获得响应。我也可以从 /login 登录,并正确重定向到 /。注销也正常工作。
接下来,所有控制器 bean 在安全方法中都有 @Secured("ROLE_USER")。但并非所有受保护的方法都得到保护。 为什么会这样?
@Secured({"ROLE_USER"})
@RequestMapping(method = RequestMethod.GET, headers = { "Range" })
public @ResponseBody
HttpEntity<List<T>> list(@RequestHeader("Range") String range) {
我到处阅读文档,但我比以往任何时候都更加困惑。
- 为什么我的方法不受保护?
- 必须在 http 命名空间定义一个访问权限,以便 @Secured 注释起作用吗?
- http 命名空间是否覆盖了我的@Secured 注释?如果是这样,我如何使用自定义过滤器定义多个“登录页面”并能够使用注释?
以下是一些事实: * 我正在使用 Spring 和 SpringSecurity 3.1 * 我有一个自定义 AuthenticationManager 从休眠 daos 检索用户详细信息。 * 一些控制器正在扩展 @Secured 注释所在的抽象类。但它仍然不适用于简单的控制器。 * 我的控制器是通过 context:component-scan 和 base-package 发现的。 * 安全性适用于一个 http 命名空间。
请帮忙,我对此很生气!
【问题讨论】:
标签: spring-mvc namespaces annotations spring-security