0

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

UserType 1 和 UserType 2 有两个独立的主体和凭据。我需要 Http POST 请求参数流向 UserType 2 的会话(即会话 2)。

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

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

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

对此有任何澄清或想法吗?

4

1 回答 1

3

我不确定如何使用 Spring Security 实现嵌套身份验证。但是您可以有两个单独的UserDetailsService实现。考虑当您有两种类型的 URL/**和的情况/admin/**,并且它们可以被两个不同的用户组使用。从 Spring Security 3.1 开始,您可以使用多个http标签(请参阅相应的文档):

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

于 2013-08-05T09:12:43.603 回答