spring-mvc - 在自定义UserDetailsService中,如何检索登录表单密码

  显示原文与译文双语对照的内容
0 0

我有一个自定义用户类,它扩展了用户( Spring Security'类和and类。 这里服务使用Hibernate服务方法查询数据库以获取用户详细信息。 如果没有在数据库中找到任何记录,而不是抛出 UsernamNotFoundException,我想创建一个虚拟的自定义用户。 但是我无法使用它,因为我不确定如何检索用户在登录页面输入的密码值。 我需要将它传递给自定义用户构造函数,以便正确地进行验证。

因这里,总之,在 loadUserByUserName() 方法中,用户在登录页面上检索输入的密码总是存在的? 先谢谢了

时间: 原作者:

0 0

我做的是类似的项目。 我刚刚开始在过去的2周内进入 Spring Security,但是在这个时间( 附加的源代码,在调试器中经过了它) 中我已经挖掘了它。

我有一个自定义用户类,它扩展 org.springframework.security.core.userdetails.User 和一个实现 org.springframework.security.core.userdetails.UserDetailsService 接口的定制类。

众所周知,system - loadUserByUsername - - - 接口中的方法的签名指定将返回一个实现 /UserDetails接口的类。

在用户登录 UserDetails Spring Security的用户名和密码的情况下,将采用实现的类,并检查登录表单/基本身份验证/摘要身份验证/摘要提供的用户名和密码。

你还没有找到通过认证方案获得最终用户提供的凭证的方法。 如果你愿意的话,我可以在明天回家的时候试着查看它( 我在家里并从内存中写下来。) 。

原作者:
0 0

我正在运行 spring 3.0.6版本和 Spring Security 3.0.6版本。

我在调试器中运行了代码。 你将无法从自定义 UserDetailsService 获得身份验证对象。

但是,我相信你可以能能够创建自己的AuthenticationProvider,以获得以下内容: http://static.springsource.org/spring-security/site/docs/3.0.x/reference/core-services.html

请从 spring 安全中引用这里代码段,该代码段循环到 AuthenticationProvider(s):


 for (AuthenticationProvider provider : getProviders()) {
 if (!provider.supports(toTest)) {
 continue;
 }

 logger.debug("Authentication attempt using" + provider.getClass().getName());

 try {
 result = provider.authenticate(authentication);

 if (result!= null) {
 copyDetails(authentication, result);
 break;
 }
 } catch (AccountStatusException e) {
//SEC-546: Avoid polling additional providers if auth failure is due to invalid account status
 eventPublisher.publishAuthenticationFailure(e, authentication);
 throw e;
 } catch (AuthenticationException e) {
 lastException = e;
 }
 }

你可以看到,它循环遍历每个AuthenticationProvider并传递凭据。 希望有帮助!

Philip

原作者:
0 0

我们可以通过扩展AbstractUserDetailsAuthenticationProvider来做一些类似于你所要求的事情。 你可以重写一个 retrieveUser ( 字符串 _userName,UsernamePasswordAuthenticationToken _authToken ),并将它的放入自己的自定义逻辑中。 返回对象是一个 UserDetails 。 所以此时你可以创建自己的自定义UserDetails并返回到框架( 请注意: 你也可以在这里方法中设置只读属性。

此时 Spring Security 将不尝试使用密码进行身份验证。 它们将它们保留到 additionalAuthenticationChecks ( 。UserDetails _userDetails,UsernamePasswordAuthenticationToken _authToken ) 方法中,你还可以重写。 因为这就是你要进行密码验证的地方,只需跳过验证并让方法返回就可以了。 此时,你的匿名用户将被验证。

最后将这个添加到你的security.xml 中


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

我希望这可以帮助你!

...