2017-06-18 122 views
0

我有springboot其他代码注册一些用户。我使用bycrpt编码器对它进行编码。的代码是这样的下面春季开机密码Bcrypt

@RequestMapping(value="/customer/new", method=RequestMethod.POST) 
    public Customer newCustomer (@RequestBody Customer customer){ 
      customer.setPassword(new BCryptPasswordEncoder().encode(customer.getPassword())); 
     return customerservice.saveCustomer(customer); 
     } 

所以全成与编码密码 财产以后存储密码这样 $ 2A $ 10 $ f25IxR/b7wNJBl7Zi.zEMOzpR2nDEw7IJwR3tv/BVKsKJRAtDe1Mq

所以我使登录其余控制器这样的下面

@RequestMapping(value = "customer/login", method = RequestMethod.POST) 
     public String login(@RequestBody Customer login) throws ServletException { 

      String jwtToken = ""; 

      if (login.getUsername()== null || login.getPassword()== null) { 
       throw new ServletException("Please fill in username and password"); 
      } 

      String username = login.getUsername(); 
      String password = new BCryptPasswordEncoder().encode(login.getPassword()); 


      Customer customer = customerservice.findByusername(username); 

      if (customer == null) { 
       throw new ServletException("Username not found."); 
      } 

      String pwd = customer.getPassword(); 

      if (!password.equals(pwd)) { 
       throw new ServletException("Invalid login. Please check your name and password."); 
      } 

登录其他控制器得到输入用户名,并从用户输入的密码。并且我尝试对密码进行编码,以便它可以作为Bcrypt编码密码返回并匹配之前存储的密码。

但它不匹配。我可以得到相同的密码编码。如何解决这个问题? 即时新使用springboot休息

+0

你的代码没问题。调试代码来查找问题。打印或调试编码和存储的密码前匹配 – Zico

回答

2

BCryptPasswordEncoder的encode()方法返回一个salted散列。这意味着使用相同参数调用此方法将而不是返回相同的值。

因此是matches()方法。用它来验证密码。

您还应该使用BCryptPasswordEncoder作为bean,以便您可以自动装入它。

@Configuration 
public class SomeConfigurationClass { 
    @Bean 
    public BCryptPasswordEncoder passwordEncoder() { 
     return new BCryptPasswordEncoder(12); 
    } 
} 
+0

我遵循您的建议。它的工作。谢啦 :) – dedypuji