Java AccessDecisionManager中的HTTP请求缺少标头

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

我正试图为我的受Spring安全保护的servlet实现一个
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>