请求未通过Spring安全链时访问身份验证对象

时间:2016-11-02 10:08:23

标签: java spring spring-security

我想要实现的是非安全页面(例如/ 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)

1 个答案:

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