Spring3 Security - SwitchUserFilter - 我们可以在 UserDetailsService 的实现中提供加密密码吗
Posted
技术标签:
【中文标题】Spring3 Security - SwitchUserFilter - 我们可以在 UserDetailsService 的实现中提供加密密码吗【英文标题】:Spring3 Security - SwitchUserFilter - Can we supply encrypted passwords in the implementation of UserDetailsService 【发布时间】:2012-02-23 09:15:19 【问题描述】:通常 authentication-manager 标签的 authentication-provider 与指向 bean 的 user-service-ref 属性相关联实现了 UserDetailsService,但在我的应用程序中,它的 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,它需要对实现 UserDetailsService 的类的引用,如下所示:
<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>
问题是 UserDetailsService 要求我提供一个与用户提供的密码匹配的密码,但我没有将原始密码存储在数据库中。没有提供实现 AuthenticationProvider 接口的 bean 的选项(就像我上面提到的 authentication-provider 属性)或告诉 spring 它需要编码的选项在将其与我从数据库提供的密码进行比较之前提供的密码。有什么建议吗?
【问题讨论】:
【参考方案1】:SwitchUserFilter
实际上并没有进行任何密码检查。如果是这样,则意味着管理员用户必须知道他们要切换到的帐户的密码,而通常情况并非如此。最好的类比是在 unix 上使用su
。
因此,您为密码提供什么值并不重要。我将为您现有的代码创建一个适配器,它实现UserDetailsService
并为UserDetails
对象中的密码返回一个随机生成的值。唯一真正需要的信息是用户名和权限(以及您想要使用的任何其他自定义数据)。
【讨论】:
以上是关于Spring3 Security - SwitchUserFilter - 我们可以在 UserDetailsService 的实现中提供加密密码吗的主要内容,如果未能解决你的问题,请参考以下文章
Spring 3,Spring Security,LDAP,如何向 LDAP 添加角色?
Spring Security:简单的保护一个SpringBoot应用程序(总结)
使用 Active Directory 的 Spring Security 3.1
Spring security JSP 标签——我需要哪些 jars?