Spring3 Security - SwitchUserFilter - 我们可以在UserDetailsS​​ervice的实现中提供加密密码

时间:2012-01-31 16:29:58

标签: authentication spring-security

身份验证管理器标记的身份验证提供程序通常与指向bean的 user-service-ref 属性相关联实现 UserDetailsS​​ervice ,但在我的应用程序中,使用了 ref 属性,该属性指向实现 AuthenticationProvider 的bean。此bean对用户提供的密码进行编码,并将其与数据库中的编码密码进行比较。 我在spring-security.xml中有以下配置

<beans:bean id="myAuthenticationProvider" class="com.mysecurity.server.security.MyAuthenticationProvider" />

<authentication-manager alias="authenticationManager">
    <authentication-provider ref="eeAuthenticationProvider" />
</authentication-manager>

现在,如果我使用SwitchUserFilter,它需要引用一个实现 UserDetailsS​​ervice 的类,如下所示:

<beans:bean id="switchUserProcessingFilter" class="org.springframework.security.web.authentication.switchuser.SwitchUserFilter">
    <beans:property name="userDetailsService" ref="userServices" />
    <beans:property name="switchUserUrl" value="/admin/switchUser" />
    <beans:property name="exitUserUrl" value="/exitUser" />
    <beans:property name="targetUrl" value="/" />
</beans:bean>

问题是 UserDetailsS​​ervice 要求我提供一个与用户提供的密码匹配的密码,但我没有将原始密码存储在数据库中。没有选项可以提供实现 AuthenticationProvider 接口的bean(比如我上面提到的 authentication-provider 属性)或者告诉spring需要编码的选项在将其与我从数据库提供的密码进行比较之前提供的密码。有什么建议吗?

1 个答案:

答案 0 :(得分:3)

SwitchUserFilter实际上没有进行任何密码检查。如果是这样,那就意味着管理员用户必须知道他们切换到的帐户的密码,通常情况并非如此。最好的比喻是在unix上使用su

因此,您为密码提供的值无关紧要。我将为您的现有代码创建一个适配器,它实现UserDetailsService并在UserDetails对象中返回密码的随机生成值。唯一真正需要的信息是用户名和权限(以及您想要使用的任何其他自定义数据)。