2012-01-09 24 views
1

我正在用一些RESTfull资源作为API制作Spring MVC Web应用程序。SpringSecurity多个名称空间和安全注释。非常混乱

我需要的问题的REST部分有一些自定义过滤器,因为我不希望有任何重定向,我想任何异常与相应的HTTP错误代码和一个基本的JSON说明翻译做。

在另一方面,网站的其他部分必须是较常见的和重定向人时没有登录的情况等

还有一两件事,我想用@Secured批注和后在某些情况下的认证。

我如何正确定义(春3.1)的多个HTTP命名空间?

这里是我的错误配置:

<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 /登录密码,我从我的自定义成功处理程序的响应。我也可以登录/登录,我得到适当的重定向到/。注销也很好。

接着,所有控制器豆已在安全方法@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注释所在的抽象类。但它仍然不适用于简单的控制器。 *我的控制器是通过上下文发现的:component-scan和base-package。 *安全性可以在一个http命名空间下正常工作。

请帮助,我惹毛了这个!

回答

0

检查出this answer关于确保web上下文对global-method-security声明可见并可能使用类代理。

为了回答您的其他问题,没有http命名空间应该不影响使用的@Secured注释,比用户通过应用程序的Web部件验证,这些信息将通过方法安全性拦截时可以使用其他作出访问决定。除非您覆盖它(使用access-decision-manager-ref),否则方法安全性将使用标准AccessDecisionManager,该标准根据用户具有的角色授予或拒绝访问。

+0

非常感谢!问题在于调度程序servlet上下文和主要上下文是不同的,因此安全注释没有在必要的地方启用。现在我已经在我的servlet上下文中添加了全局安全注释,并且一切正常!这里是[Faq](http://static.springsource.org/spring-security/site/faq/faq.html#faq-method-security-in-web-context)。 – adreide 2012-01-10 07:18:16