两个单独的UserDetailsS​​ervice实现

时间:2013-08-04 06:22:51

标签: spring-security

是否可以在单个Web应用程序中实现UserDetailsS​​ervice实现? 更确切地说,我的要求是我有一个Servlet,它监听需要针对一种类型的用户进行身份验证的http POST请求(比如UserType 1),Http POST请求包含一些我可以用来认证用户的字段(用户ID和一些Hash String)。验证成功后,用户将再次转发到另一个登录页面,此时用户类型为UserType 2时再次进行身份验证。 这里,

UserType 1和UserType 2具有两个单独的主体和凭证。 我需要将Http POST请求参数传递给UserType 2的会话(即会话2)。

会话2应该存在直到会话1被销毁。

我还猜我还需要两个身份验证入口点?

我的直觉是,这是不可能的(我希望我错了)!

有关此问题的任何澄清或想法?

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 标记声明不同的入口点。