Java AccessDecisionManager中的HTTP请求缺少标头
我正试图为我的受Spring安全保护的servlet实现一个Java AccessDecisionManager中的HTTP请求缺少标头,java,servlets,spring-security,Java,Servlets,Spring Security,我正试图为我的受Spring安全保护的servlet实现一个AccessDecisionManager,需要检查“Authorization”头的内容。我有下面的代码,但是标题(我100%确定正在发送)正在返回null: public class MyAccessDecisionManager implements AccessDecisionManager { public void decide(Authentication arg0, Object arg1, Collection
AccessDecisionManager
,需要检查“Authorization”头的内容。我有下面的代码,但是标题(我100%确定正在发送)正在返回null
:
public class MyAccessDecisionManager implements AccessDecisionManager {
public void decide(Authentication arg0, Object arg1, Collection<ConfigAttribute> arg2) throws AccessDeniedException, InsufficientAuthenticationException {
HttpServletRequest req = ((FilterInvocation) arg1).getHttpRequest();
String authHeader = req.getHeader("Authorization"); //this is null
//Do stuff
}
}
MimeHeaders
包含我的“Authorization”头并具有正确的值,因此我知道该头正在发送到我的服务器。但是,TreeMap headers
缺少我的授权头,并且(我假设)是getHeaders()
正在查看的
我尝试在客户端添加一个“foo”头来检查问题是否与“授权”有关,但我看到了完全相同的行为。我唯一可以访问的标题是“接受编码”、“连接”、“主机”和“用户代理”
配置为:
<bean id="myAccessDecisionManager" class="com.example.MyAccessDecisionManager" />
<security:http pattern="/api/**"
access-decision-manager-ref="myAccessDecisionManager"
entry-point-ref="myAccessDeniedHandler">
<security:intercept-url pattern="/**" access="IS_AUTHENTICATED_ANONYMOUSLY" />
<security:anonymous enabled="true"/>
<security:access-denied-handler ref="myAccessDeniedHandler"/>
</security:http>
有人能解释一下发生了什么或者为什么标题丢失了吗?是否有任何方法可以访问我的
decise()
函数中的值?(或者是否有更好的方法根据标头值进行决策?我无法确定AccessDecisionManager
中的问题是什么,或者如何获得对其他请求标头的访问权限。相反,我通过在api路径上禁用Spring安全性来解决这个问题:
<security:http pattern="/api/**" security="none"/>
…并改用Spring MVC拦截器:
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/api/**"/>
<bean class="com.example.MyInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
我必须在拦截器的
preHandle()
方法中包含我的AccessDecisionManager
和我的AuthenticationEntryPoint
的逻辑,这并不理想,但很有效。您是否收到任何错误,或者只是缺少标题?没有错误,只是没有。我将此编辑到问题中,但我也尝试添加“foo=bar”以查看它是否是专门的授权,并看到了相同的行为。
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/api/**"/>
<bean class="com.example.MyInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>