使用Java配置注册Spring Security自定义过滤器



我正在尝试使用Spring Security设置预认证授权,类似于外部系统进行身份验证并将登录信息保存在cookie中的站点管理员。然而,要做到这一点,我需要重定向到外部URL。

我试着从AbstractPreAuthenticatedProcessingFilter的实现中做它,但这不起作用,因为HttpServletResponse对象不可用。

一种更合适的方法似乎是添加一个自定义过滤器来检查cookie并进行重定向,一旦cookie可用,然后将控制传递给Spring Security过滤器。如何在基于Java配置的Spring Security应用程序中注册这个自定义过滤器?

常用的方法是使用AuthenticationEntryPoint重定向用户到外部认证接口,如LoginUrlAuthenticationEntryPoint。Spring Security在确定用户需要进行身份验证时自动调用入口点。

一旦用户返回到您的应用程序,它应该命中自定义过滤器,扩展AbstractPreAuthenticatedProcessingFilter,并从getPreAuthenticatedPrincipal方法中的cookie/header/令牌(可能经过一些有效性和完整性检查)中提取用户名。

Spring配置可以类似于:

<security:http entry-point-ref="externalAuthentication">
    <security:custom-filter after="BASIC_AUTH_FILTER" ref="cookieAuthentication"/>
    <security:intercept-url pattern="/**" access="IS_AUTHENTICATED_FULLY"/>
</security:http>
<bean id="externalAuthentication" class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint">
    <constructor-arg value="http://server.local/authenticationService"/>
</bean>
<bean id="cookieAuthentication" class="custom class extending org.springframework.security.web.authentication.preauth.AbstractPreAuthenticatedProcessingFilter">
    ...
</bean>

最新更新