如果我正确地满足了您的要求,那么使用 Spring Security 的预身份验证框架类来实现所需的身份验证机制可能是最简单的。
一般来说,这些类是为了支持这样的场景而设计的,在这些场景中,身份验证机制由一些外部系统提供,确保 http 请求包含某种可以被任何 webapp 使用的身份验证信息。在您的情况下,身份验证信息似乎位于可用于识别用户的 cookie 中。
假设您已经有一个UserDetailsService
按用户名查找用户的实现,您可以很容易地实现您的要求:
1)创建一个AbstractPreAuthenticatedProcessingFilter
实现抽象方法的子类,getPreAuthenticatedPrincipal(HttpServletRequest)
从cookie中提取主体(用户名)。getPreAuthenticatedCredentials()
如果请求中没有凭据,还有另一种抽象方法 ( ) 可以简单地返回 null。抽象超类中已经实现的逻辑然后创建一个包含提取的主体的身份验证令牌,并将其提交给身份验证管理器。
2) 创建一个 bean 类型PreAuthenticatedAuthenticationProvider
,它将从身份验证管理器接收身份验证令牌,以便完全填充它(加载用户的角色)。这个类需要注入一个变体,UserDetailsService
它接受整个身份验证令牌,而不仅仅是用户名。您可以简单地使用UserDetailsByNameServiceWrapper
使您的原件适应UserDetailsService
该界面:
<bean id="preAuthAuthProvider" class="org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationProvider">
<property name="preAuthenticatedUserDetailsService">
<bean id="userDetailsServiceWrapper" class="org.springframework.security.core.userdetails.UserDetailsByNameServiceWrapper">
<property name="userDetailsService" ref="yourUserDetailsService"/>
</bean>
</property>
</bean>
3)使用类似于文档中显示的配置将事物连接在一起:
<security:http>
...
<security:custom-filter position="PRE_AUTH_FILTER" ref="preAuthFilter" />
</security:http>
<bean id="preAuthFilter" class="com.whatever.YourPreAuthFilter"/>
<security:authentication-manager>
<security:authentication-provider ref="preAuthAuthProvider" />
</security:authentication-manager>
因此,实现您的要求所需要的只是一个具有一个方法的子类,以及一些额外的配置来将它与现有的支持类连接起来。