春季安全 - SecurityContext.authentication中的taglib空和JS

2019-08-18 08:26发布

我一直在努力,现在这个问题的一小会儿。 发现它的几个职位,但没有解决我的问题。 它可能有一些做的事实的SecurityContext是boud到一个特定的线程但即便如此,我不知道如何解决这个问题:

考虑下面的代码检索被登录的用户:

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

在控制器中运行该代码将返回(正确地)登录的用户。从标签库运行此代码或JSP抛出NPE(认证= 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>

从春季安全配置文件摘录:

    <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>

Answer 1:

解决

这个问题从过滤器序列出现。 该的PageFilter(的sitemesh)春季安全过滤器之前被调用,并因为这个安全上下文尚未在JSP可用。 在web.xml中更改过滤器的顺序(保安过滤器第一)固定的问题。



Answer 2:

这似乎是一个很明显的问题,但你有没有强迫用户在之前给他们的任何一点访问页面/myaccount.htm登录(即身份验证)? 我没有看到任何映射需要在这就是为什么我问你的对象定义源匿名访问的登录页面。 如果用户不能够访问认证/myaccount.htm,则没有本金会被通过,他们已经访问该页面时的安全上下文中创建的,因此您的NullPointerException异常。 此外,您使用的是基于表单的认证? HTTP基本认证? 由Acegi的支持的一些其他类型的?



文章来源: Spring security - SecurityContext.authentication null in taglib and jsp but ok in controller