Spring安全性 - 在taglib和jsp中的SecurityContext.authentication null,但在控制器中确定

时间:2009-10-15 13:02:52

标签: security spring nullpointerexception spring-security taglib

我一直在努力解决这个问题。找到几篇关于它的帖子但没有解决我的问题。它可能与SecurityContext对特定线程有关的事实有关,但即便如此我也不知道如何解决它:

请考虑使用以下代码来检索已登录的用户:

SecurityContextHolder.getContext().getAuthentication().getPrincipal()

在控制器中运行此代码将返回(正确)登录的用户。 从taglib或jsp运行此代码会抛出NPE(authentication = null)。 弹簧标签 也不起作用(大概是出于同样的原因)。

从web.xml中提取:

    <filter>
    <filter-name>AcegiFilter</filter-name>
    <filter-class>org.acegisecurity.util.FilterToBeanProxy</filter-class>
    <init-param>
        <param-name>targetClass</param-name>
        <param-value>org.acegisecurity.util.FilterChainProxy</param-value>
    </init-param>
</filter>

<filter-mapping>
    <filter-name>AcegiFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

从spring security配置文件中提取:

    <bean id="filterChainProxy" class="org.springframework.security.util.FilterChainProxy">
    <property name="filterInvocationDefinitionSource">
        <value>
            CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON 
            PATTERN_TYPE_APACHE_ANT
            /**=httpSessionIntegrationFilter,authenticationProcessingFilter,exceptionTranslationFilter,filterSecurityInterceptor
        </value>
    </property>
</bean>
    <bean id="filterSecurityInterceptor"
    class="org.springframework.security.intercept.web.FilterSecurityInterceptor">
    <property name="authenticationManager" ref="authenticationManager" />
    <property name="accessDecisionManager" ref="accessDecisionManager" />
    <property name="alwaysReauthenticate" value="true" />
    <property name="objectDefinitionSource">
        <value>
            CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON 
            PATTERN_TYPE_APACHE_ANT
            /myaccount.htm=ROLE_CUSTOMER
        </value>
    </property>
</bean>

2 个答案:

答案 0 :(得分:5)

已解决

问题出现在过滤器序列中。在Spring安全过滤器之前调用了PageFilter(sitemesh),因此在jsp中尚未提供安全上下文。更改web.xml中的过滤器顺序(安全过滤器优先)修复了该问题。

答案 1 :(得分:0)

这似乎是一个显而易见的问题,但您是否曾强制用户在访问/myaccount.htm页面之前的任何时候登录(即进行身份验证)?我没有在对象定义源中看到需要匿名访问的登录页面的任何映射,这就是我问的原因。如果用户可以在不进行身份验证的情况下访问/myaccount.htm,那么在他们访问页面时就不会在安全上下文中创建任何主体,因此您的NullPointerException。另外,您使用基于表单的身份验证吗? HTTP BASIC认证? Acegi支持的其他一些类型?