Spring Security多个名称空间和安全注释。很混乱

时间:2012-01-09 15:40:23

标签: spring-mvc namespaces annotations spring-security

我正在制作一个Spring MVC网络应用程序,其中包含一些RESTfull资源作为API。

我需要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来从hibernate daos检索用户详细信息。 *有些控制器正在扩展@Secured注释所在的抽象类。但它仍然不适用于简单的控制器。 *我的控制器是通过上下文发现的:组件扫描和基础包。 *使用一个http命名空间,安全性可以正常工作。

请帮忙,我生气了!

1 个答案:

答案 0 :(得分:0)

查看this answer,了解确保网络上下文对global-method-security声明可见,并可能使用类代理。

要回答您的其他问题,http命名空间不应该影响@Secured注释的使用,除非用户通过应用程序的Web部分进行身份验证,并且该信息将是在进行访问决策时由方法安全拦截器使用。除非您覆盖它(使用access-decision-manager-ref),否则方法安全性将使用标准AccessDecisionManager,该标准基于用户拥有的角色授予或拒绝访问权限。