Java 使用Spring Security BCryptPasswordEncoder散列密码时凭据错误

Java 使用Spring Security BCryptPasswordEncoder散列密码时凭据错误,java,authentication,spring-security,spring-boot,Java,Authentication,Spring Security,Spring Boot,我正在使用新的BCryptPasswordEncoder将用户密码散列到数据库(在我的例子中,这是一个MongoDB)。当我刚刚测试我的登录时,我在安全配置中将密码编码器设置为BCryptPasswordEncoder,但是当我尝试登录时(当然是使用正确的凭据),我会得到错误的凭据。我错过了什么 安全配置: import org.springframework.beans.factory.annotation.Autowired; import org.springframewo

我正在使用新的
BCryptPasswordEncoder
将用户密码散列到数据库(在我的例子中,这是一个MongoDB)。当我刚刚测试我的登录时,我在安全配置中将密码编码器设置为
BCryptPasswordEncoder
,但是当我尝试登录时(当然是使用正确的凭据),我会得到错误的凭据。我错过了什么

安全配置:

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
    import org.springframework.security.config.annotation.web.builders.HttpSecurity;
    import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
    import org.springframework.security.config.annotation.web.servlet.configuration.EnableWebMvcSecurity;
    import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
    import org.springframework.security.crypto.password.PasswordEncoder;

    @Configuration
    @EnableWebMvcSecurity
    public class VZWebSecurityConfig extends WebSecurityConfigurerAdapter{

    @Autowired
    VZUserDetailsService userDetailsService;

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception{
        auth.userDetailsService(userDetailsService).passwordEncoder(encoder());
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception{
            http
            .authorizeRequests()
                .antMatchers("/", "/home").permitAll()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .permitAll()
                .and()
            .logout()
                .permitAll();
    }

    @Bean
    public PasswordEncoder encoder(){
        return new BCryptPasswordEncoder();
    }

    }
为了从一些有效用户开始,我使用一些用户初始化DB:

import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

import vertyze.platform.data.constants.VZUserRoles;


@Configuration
@ComponentScan("it.vertyze.platform")
@EnableAutoConfiguration
public class Application implements CommandLineRunner {

    @Autowired
    VZUserRepository userRepository;

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }


    @Override
    public void run(String... args) throws Exception {
        userRepository.deleteAll();
        PasswordEncoder encoder = new BCryptPasswordEncoder();

        List<VZUserRoles> siteAdmin = new ArrayList<VZUserRoles>();
        siteAdmin.add(VZUserRoles.SITE_ADMIN);

        List<VZUserRoles> siteUser = new ArrayList<VZUserRoles>();
        siteUser.add(VZUserRoles.SITE_VIEWER);

        VZUser user1 = new VZUser();
        VZUser user2 = new VZUser();

        user1.setUsername("user1");
        user1.setPassword(encoder.encode("password1"));
        user1.setRoles(siteAdmin);

        user2.setUsername("user2");
        user2.setPassword(encoder.encode("password2"));
        user2.setRoles(siteUser);

        userRepository.save(user1);
        userRepository.save(user2);

    }

}
import java.util.ArrayList;
导入java.util.List;
导入org.springframework.beans.factory.annotation.Autowired;
导入org.springframework.boot.CommandLineRunner;
导入org.springframework.boot.SpringApplication;
导入org.springframework.boot.autoconfigure.EnableAutoConfiguration;
导入org.springframework.context.annotation.ComponentScan;
导入org.springframework.context.annotation.Configuration;
导入org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
导入org.springframework.security.crypto.password.PasswordEncoder;
导入vertyze.platform.data.constants.VZUserRoles;
@配置
@ComponentScan(“it.vertyze.platform”)
@启用自动配置
公共类应用程序实现CommandLineRunner{
@自动连线
VZUserRepository用户存储库;
公共静态void main(字符串[]args){
SpringApplication.run(Application.class,args);
}
@凌驾
公共无效运行(字符串…参数)引发异常{
userRepository.deleteAll();
PasswordEncoder编码器=新的BCryptPasswordEncoder();
List siteAdmin=new ArrayList();
添加(VZUserRoles.SITE\u ADMIN);
List siteUser=new ArrayList();
添加(VZUserRoles.SITE\u查看器);
VZUser user1=新VZUser();
VZUser user2=新的VZUser();
user1.setUsername(“user1”);
user1.setPassword(encoder.encode(“password1”));
user1.setRoles(siteAdmin);
user2.setUsername(“user2”);
user2.setPassword(encoder.encode(“password2”));
user2.setRoles(siteUser);
userRepository.save(user1);
userRepository.save(user2);
}
}
有人能帮我吗?谢谢

这是偶然的吗

WARN  o.s.s.c.bcrypt.BCryptPasswordEncoder - Encoded password does not   look like BCrypt 
在调试日志中? 如果是,您应该检查用户表中密码行的长度是否足够大。
bcrypt算法产生长度为60的散列,因此,如果碰巧有一行的类型为varchar(45),则散列可能会被截断。

您确定自动连线方法中编码器的设置工作正常吗?@MarianP。是的,看起来很好用。另外,当在密码字段中放入实际的哈希值时,错误仍然存在。好吧,这很有趣,但我不确定从这里看到的可能有什么错误。也许看看这里我也有同样的问题,你找到解决办法了吗。@thomi你找到解决问题的办法了吗?我也面临同样的问题。