我正在制作一个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) {
我到处读过文件,我比以前更加困惑。
以下是一些事实: *我正在使用Spring和SpringSecurity 3.1 *我有一个自定义AuthenticationManager来从hibernate daos检索用户详细信息。 *有些控制器正在扩展@Secured注释所在的抽象类。但它仍然不适用于简单的控制器。 *我的控制器是通过上下文发现的:组件扫描和基础包。 *使用一个http命名空间,安全性可以正常工作。
请帮忙,我生气了!答案 0 :(得分:0)
查看this answer,了解确保网络上下文对global-method-security
声明可见,并可能使用类代理。
要回答您的其他问题,http
命名空间不应该影响@Secured
注释的使用,除非用户通过应用程序的Web部分进行身份验证,并且该信息将是在进行访问决策时由方法安全拦截器使用。除非您覆盖它(使用access-decision-manager-ref
),否则方法安全性将使用标准AccessDecisionManager
,该标准基于用户拥有的角色授予或拒绝访问权限。