春天的安全性 - 在标签库和JSP SecurityContext.authentication空,但在控制器确定
-
21-09-2019 - |
题
我一直在努力与这个问题一会儿现在。发现它的几个职位,但没有解决我的问题。它可能有一些做的事实,是的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>
解决方案
分辨
问题从过滤器序列产生的。该的PageFilter(的sitemesh)春季安全过滤器之前被调用,并因为这个安全上下文尚未在JSP可用。更改过滤器的顺序在web.xml(保安过滤器第一)固定的问题。
其他提示
这似乎是一个明显的问题,但你之前,他们迫使用户在任何点登录(即身份验证)访问该网页/myaccount.htm?我没有看到任何映射需要在这就是为什么我问你的对象定义源匿名访问的登录页面。如果没有身份验证的用户可以访问/myaccount.htm,则没有本金会被安全上下文的时候创建的,他们已经访问的页面,因此您的NullPointerException异常。此外,您使用的是基于表单的认证? HTTP基本认证?通过的Acegi支持的其他一些类型?
不隶属于 StackOverflow