【问题标题】:SpringSecurity multiple namespaces and secured-annotations. Great confusionSpringSecurity 多个命名空间和安全注释。大混乱
【发布时间】: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


    【解决方案1】:

    查看this answer,了解有关确保global-method-security 声明可以看到网络上下文以及可能使用类代理的信息。

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

    【讨论】:

    • 非常感谢!问题是调度程序 servlet 上下文和主上下文不同,因此没有在必须启用的地方启用安全注释。现在我在我的 servlet 上下文中添加了全局安全注释,一切正常!这是Faq
    猜你喜欢
    • 2012-04-03
    • 2013-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-26
    相关资源
    最近更新 更多