我正在尝试使用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>