是否可以在单个Web应用程序中实现UserDetailsService实现? 更确切地说,我的要求是我有一个Servlet,它监听需要针对一种类型的用户进行身份验证的http POST请求(比如UserType 1),Http POST请求包含一些我可以用来认证用户的字段(用户ID和一些Hash String)。验证成功后,用户将再次转发到另一个登录页面,此时用户类型为UserType 2时再次进行身份验证。 这里,
UserType 1和UserType 2具有两个单独的主体和凭证。 我需要将Http POST请求参数传递给UserType 2的会话(即会话2)。
会话2应该存在直到会话1被销毁。
我还猜我还需要两个身份验证入口点?
我的直觉是,这是不可能的(我希望我错了)!
有关此问题的任何澄清或想法?
答案 0 :(得分:3)
我不确定如何使用Spring Security实现嵌套身份验证。但是您可以有两个单独的UserDetailsService
实现。如果您有两种类型的网址/**
和/admin/**
,请考虑这种情况,并且可以由两个不同的用户组使用。从Spring Security 3.1开始,您可以使用多个 http 标记(see corresponding documentation):
<http pattern="/admin/**" authentication-manager-ref="adminAuthenticationManager">
<intercept-url pattern="/**" access="ROLE_ADMIN" />
...
</http>
<authentication-manager id="adminAuthenticationManager" >
<authentication-provider user-service-ref="adminUserDetailsService"/>
</authentication-manager>
<bean id="adminUserDetailsService" class="com.mucompany.security.AdminUserDetailsService"/>
<!-- No pattern, so everything will be matched -->
<http authentication-manager-ref="adminAuthenticationManager">
<intercept-url pattern="/**" access="ROLE_USER" />
...
</http>
<authentication-manager id="userAuthenticationManager" >
<authentication-provider user-service-ref="publicUserDetailsService"/>
</authentication-manager>
<bean id="publicUserDetailsService" class="com.mucompany.security.PublicUserDetailsService"/>
您甚至可以使用 entry-point-ref 属性为每个 http 标记声明不同的入口点。