Spring 在PasswordEncoder中获取用户名

Spring 在PasswordEncoder中获取用户名,spring,spring-security,Spring,Spring Security,我为我的spring应用程序创建了自己的身份验证提供程序,并在其上指定了org.springframework.security.crypto.password.PasswordEncoder。我将我的用户和他们的加密密码(在数据库算法之后)存储在数据库中。为了能够进行身份验证,我需要从org.springframework.security.crypto.password.PasswordEncoder类访问发送用于身份验证的用户名。谁能指导我怎么做?还是有其他办法 注意:我使用的是Sprin

我为我的spring应用程序创建了自己的身份验证提供程序,并在其上指定了
org.springframework.security.crypto.password.PasswordEncoder
。我将我的用户和他们的加密密码(在数据库算法之后)存储在数据库中。为了能够进行身份验证,我需要从
org.springframework.security.crypto.password.PasswordEncoder
类访问发送用于身份验证的用户名。谁能指导我怎么做?还是有其他办法


注意:我使用的是SpringSecurity 3.2。

假设用户输入用户名,UserPassword是User,Pwd。 为了进行身份验证,您可以执行以下操作

  • 获取用户输入的用户名和密码(用户,Pwd)
  • 使用
    String encodedPassword=passwordEncoder.encode(pwd)
  • 比较如果UserEnteredUserName=DBUserNAme和UserEnteredEdedCodedPassword==EncodedPasswordInDB,则可以根据匹配值对用户进行身份验证

  • 我甚至不在乎这是不是一个老问题,我只是花了9个小时试图弄明白这一点。最好把它放在这里,以防别人再次发现

    String username = ((ServletRequestAttributes)RequestContextHolder.currentRequestAttributes()).getRequest().getParameter("username");
    
    使用上面的代码,我能够从当前请求中提取用户名

    注意:您必须使用以下类
    org.springframework.web.context.request.RequestContextHolder


    有一个类似的错误让我做错了。

    这是我的问题。如何从my
    PasswordEncoder
    中输入用户名?密码编码器只是将密码编码到MD5/SHA或任何加密技术,它与用户名无关。如果您的是web应用程序,您可以从请求参数中获取用户名。我理解。但是,有没有办法从
    PasswordEncoder
    访问此请求参数?我对spring非常陌生,我还不清楚后台会发生什么。请澄清您想使用哪个
    PasswordEncoder
    org.springframework.security.authentication.encoding
    org.springframework.security.crypto.password
    一个。@M.Deinum是位于
    org.springframework.security.crypto.password
    包下的新密码。您能否将其添加到您的问题中,因为这可能会影响如何,解决这个问题。另外,为什么您需要用户名,密码加密中使用的是用户名吗?为什么您要实现自己的
    AuthenticationProvider
    ?我建议使用旧的
    PasswordEncoder
    (尽管它已被弃用),实现一个
    SaltSource
    ,为用户检索正确的salt,并让Spring安全性来完成硬任务。新的基于bcrypt的类旨在与系统范围的salt一起工作。而旧的
    PasswordEncoder
    可以使用基于每个用户的salt.Vote-up进行共享。谢谢。我的情况很糟。任何想法。未找到线程绑定请求:您是指实际web请求之外的请求属性,还是在最初接收线程之外处理请求?如果您实际上是在web请求中操作,并且仍然收到此消息,那么您的代码可能是在DispatcherServlet之外运行的:在这种情况下,请使用RequestContextListener或RequestContextFilter公开当前请求。我将
    getParameter(“用户名”)
    更改为
    getParameter(“用户名”)
    ,它可以工作。