2011-10-12 82 views
1

我有一个自定义用户类,它扩展了User(Spring Security)类和Custome UserDetailsS​​ervice类。此服务使用Hibernate服务方法查询数据库以获取用户详细信息。如果在该数据库中没有找到该userId的记录,而不是抛出UsernamNotFoundException,那么我想创建一个虚拟的Custom用户对象,并使用只读属性传递身份验证。但我无法正常工作,因为我不确定如何检索用户在登录页面输入的密码值。我需要将它传递给自定义用户的构造函数,以正确地验证它。如何检索自定义UserDetailsS​​ervice中的登录表单密码

因此,总结起来,有没有办法检索用户在loadUserByUserName()方法内的登录页面输入的密码?在此先感谢

+0

我知道你不是在问什么,但是如何使用角色呢?在用户表中添加其他字段,例如角色,并将虚拟用户作为其他普通用户添加到数据库,但设置角色ROLE_DUMMY_USER。在网络应用程序中,您可以检查登录用户的角色,并根据他所拥有的角色决定他可以做什么以及不能做什么。 – marioosh

+0

感谢您的答复marioosh ..这正是我最初的想法,但该应用程序允许单个会话每个用户。因此,不能在所有虚拟用户使用的用户表中记录一条记录。 – RKodakandla

回答

2

我正在做一些类似的事情当前项目。在过去的两周里,我刚刚开始涉足Spring Security,但在那段时间里我真的深入了解了它(附加源代码,在调试器中进行了检查)。

我有一个延伸org.springframework.security.core.userdetails.User自定义用户类和实现org.springframework.security.core.userdetails.UserDetailsS​​ervice界面的自定义类。

如你所知,在loadUserByUsername方法在的UserDetailsS​​ervice接口的签名指定一个类实现的UserDetails接口将被退回。

Spring Security的是要采取实现的UserDetails类和检查通过登录表单/基本身份验证提供的用户名和密码/摘要式身份验证/对用户名(无论验证您选择方案)和密码的UserDetails

我还没有找到一种方法,您可以通过身份验证方案获取由最终用户提供的凭据。如果你愿意的话,我可以试着在明天回去工作时看看它(我在家里并且从内存中写下来)。

+0

感谢Philip为您提供的帮助。我希望你找到一些有关如何检索它的信息..我正在做的确如此,扩展User类以具有Customuser类,并且我遇到了新问题。如果委托人被第三方我似乎无法实例化自定义用户,因为没有密码..... :( – RKodakandla

0

我正在运行Spring 3.0.6 RELEASE和Spring Security 3.0.6 RELEASE。

我在调试器中运行的代码,你将无法在认证对象从自定义的UserDetailsS​​ervice获得。

不过,我相信你可以创建自己的AuthenticationProvider,使程序在它:http://static.springsource.org/spring-security/site/docs/3.0.x/reference/core-services.html

请参考此代码从Spring Security的org.springframework.security.authentication.ProviderManager,其循环通过AuthenticationProvider的(一个或多个)片段:

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并传递凭据。希望有所帮助!

菲利普

+0

感谢菲利普..我会尝试,看看我是否可以利用这个.. – RKodakandla

0

我们能够做一些类似你通过扩展AbstractUserDetailsAuthenticationProvider问什么东西。有一个方法retrieveUser(String _userName,UsernamePasswordAuthenticationToken _authToken),您可以覆盖并放入您自己的自定义逻辑中。返回对象是一个UserDetails。因此,您可以创建自己的自定义UserDetails并将其返回给框架(注意:您也可以在此方法中设置只读属性)。

此时,Spring Security将不会尝试使用密码进行身份验证。他们将其留给您可以覆盖的additionalAuthenticationChecks(UserDetails _userDetails,UsernamePasswordAuthenticationToken _authToken)方法。由于这是您要进行密码验证的地方,因此可以跳过验证并让方法返回。此时你的匿名用户将被验证。

最后补充到这一点您的security.xml

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

我希望这有助于!

+0

谢谢jcurtin ..这正是我我正在寻找.. – RKodakandla

相关问题