我想要实现的是非安全页面(例如/ index),但在进行身份验证时,它应该有权访问身份验证对象以显示登录用户。
根据Spring文档,当不通过安全过滤器链时,身份验证对象不可用:
如果要在请求期间使用SecurityContext内容的内容,则它必须已通过安全筛选器链。否则,将不会填充SecurityContextHolder,并且内容将为null。
但是要禁用页面安全性,禁用安全筛选器:
<http pattern="/index" security="none"/>
与filters =“none”类似,这也将完全禁用该请求路径的安全过滤器链 - 因此,当在应用程序中处理请求时,Spring Security功能将无法使用。
我也无法使用<intercept-url pattern="/index" access="permitAll" />
,因为这会向所有经过身份验证的用户授予权限。由于AbstractSecurityInterceptor
将在未找到身份验证对象时抛出AuthenticationCredentialsNotFoundException
。
作为Spring Security的新手,如何构建一个可以访问SecurityContext的非安全页面? (使用带有XML配置的Spring Security 3.2.9)
答案 0 :(得分:1)
您可以使用AnonymousAuthenticationFilter
创建并在没有用户登录时将AnonymousAuthenticationToken
实例分配给SecurityContextHolder.getContext().setAuthentication()
。因此您将无法获得AuthenticationCredentialsNotFoundException
并且可以执行此操作一个简单的instanceof
操作,用于检查用户是否已登录或匿名。
<bean id="anonymousAuthFilter"
class="org.springframework.security.web.authentication.AnonymousAuthenticationFilter">
<property name="key" value="anonymousUser"/>
<property name="userAttribute" value="anonymousUser,ROLE_ANONYMOUS"/>
</bean>
<http pattern="/**">
<intercept-url pattern="/index" access="permitAll"/>
<custom-filter ref="anonymousAuthFilter" position="ANONYMOUS_FILTER" />
</http>