【问题标题】:How to verify password with Spring如何使用 Spring 验证密码
【发布时间】:2015-08-19 21:23:47
【问题描述】:

我发现了如何使用 SpringMVC 对某个人的密码进行哈希处理并将其保存在数据库中:

BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
String pw = passwordEncoder.encode("test");

现在的问题是,我如何验证来自请求的密码以让用户登录我的网络应用程序? 经过一些研究,我发现有很多方法可以做到这一点。一些解决方案适用于用户角色。

我的 webapps 应该做的是为我的用户提供一个登录页面,他们可以在其中注册(在这里我将使用上面显示的代码保留密码)。后 注册他们应该能够登录,这意味着我需要从登录表单中验证密码。 有没有最先进的例子?

【问题讨论】:

  • 使用 spring-security projects.spring.io/spring-security
  • 但该示例仅适用于定义的用户和密码。但是我的 webapp 可能有 100 个用户,所以 authprovider 需要以某种方式从数据库中获取。

标签: java spring authentication passwords


【解决方案1】:

这就是原始密码与编码密码的匹配方式:

passwordEncoder.matches("rawPassword", user.getPassword()),

但正如其他人所说,自己编写 Security 代码很麻烦,因此我建议改用 Spring Security。是的,它确实需要努力学习,但你可以找到很好的教程。 Here 是一个独特的教程(免责声明:我是作者)。

【讨论】:

  • 有可能比较两个编码密码吗?例如:新密码:XXXX 确认密码:XXXX
【解决方案2】:

这是我在春季实现自己的更改密码功能时使用的

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;

@Service
public class Utility {

   private static BCryptPasswordEncoder passwordEcorder = new BCryptPasswordEncoder();


   public String bcryptEncryptor(String plainText) {
       return passwordEcorder.encode(plainText);
   }

   public Boolean doPasswordsMatch(String rawPassword,String encodedPassword) {
      return passwordEcorder.matches(rawPassword, encodedPassword);
   }
}

然后在代码中匹配两个密码,即 rawPassword = password1234 和 encodedPassword = $2a$10$zxvEq8XzYEYtNjbkRsJEbukHeRx3XS6MDXHMu8cNuNsRfZJWwswDy

代码如下(在 Utility 类的一些自动装配对象上调用):

  doPasswordsMatch( rawPassword, encodedPassword );

如果密码匹配,则返回 TRUE,否则返回 FALSE

【讨论】:

    【解决方案3】:

    要验证用户输入的密码是否正确,请对输入的值使用相同的单向哈希值,然后将其与之前的哈希值进行比较 - 如果它们相同,则输入的密码是正确的。

    【讨论】:

    • 当用户创建他们的用户 ID/密码时,您使用的代码与您第一次用来散列密码的代码相同。使用单向哈希,您不会解密存储的密码,而是对输入的值进行哈希处理并将其与已存储的哈希值进行比较。如果相同,则输入的密码正确。
    • 是的,它应该适用于许多加密器,但在 BCryptPasswordEncoder 的情况下却不行,就像我尝试过的那样。
    【解决方案4】:

    身份验证和授权不是 Web 应用程序中的简单目标。

    Spring 确实有一个安全框架来帮助解决这个问题,但是它使用起来并不简单。

    我建议您评估 Apache Shiro 安全框架工作(可通过 ASF 网站获得),它在简化 Spring 和 Java EE 的安全性方面做得最好。

    http://shiro.apache.org/

    它具有使您能够从用户信息的自定义存储中进行身份验证的抽象。有许多使用 Shiro 的在线简短身份验证教程可以帮助您。

    【讨论】:

      猜你喜欢
      • 2017-04-25
      • 2013-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多