当前位置: 首页 > 知识库问答 >
问题:

Spring AuthenticationManagerBuilder密码哈希

端木渝
2023-03-14

我试图在Spring中设置用户身份验证,但在添加密码哈希后,它无法进行身份验证。我正在使用Spring Boot和Spring Security。

以下是我的代码的简短版本:

客户实体:

@Entity
public class Customer {

  private String username;
  private String password;

  public Customer() {
  }

  @Column
  public String getUsername() {
    return username;
  }

  public void setUsername(String username) {
    this.username = username;
  }

  @Column(length=100)
  public String getPassword() {
    return password;
  }

  public String setPassword(String password) {
    this.password = new BCryptPasswordEncoder().encode(password);
  }
}

安全配置:

@SpringBootApplication
@EnableAutoConfiguration
public class DemoApplication {

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

@Configuration
@EnableWebSecurity
class SecurityConfig extends WebSecurityConfigurerAdapter {

@Autowired
private UserDetailsService userDetailsService;

@Autowired
private CustomerRepository customerRepository;

@Bean
public BCryptPasswordEncoder passwordEncoder() {
    return new BCryptPasswordEncoder();
}

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests().anyRequest().fullyAuthenticated().and().
            httpBasic().and().
            csrf().disable();
}

@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth
            .userDetailsService(userDetailsService)
            .passwordEncoder(passwordEncoder());
}

@Bean
protected UserDetailsService userDetailsService() {
    return new UserDetailsService() {

        @Override
        public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
            Customer customer = customerRepository.findByUsername(username);
            if(user != null) {
                return new User(username, customer.getPassword(), true, true, true, true,
                        AuthorityUtils.createAuthorityList("USER"));
            } else {
                throw new UsernameNotFoundException("could not find the user '"
                        + username + "'");
            }
        }
    };
}
}

就像我说的,如果我删除密码编码器(从 AuthenticationManagerBuilder 和 Customer 实体),输入用户名和密码将进行身份验证。但是,当我添加BCryptPasswordEncoder时,它不会进行身份验证,也不会给出错误消息。

共有1个答案

酆奇文
2023-03-14

不要在实体的set方法中编码密码。您只需要在创建新用户时执行此操作。Spring Security将处理其余的

 类似资料:
  • 每个人在建构 PHP 应用时终究都会加入用户登录的模块。用户的帐号及密码会被储存在数据库中,在登录时用来验证用户。 在存储密码前正确的 哈希密码 是非常重要的。密码的哈希操作是单向不可逆的,该哈希值是一段固定长度的字符串且无法逆向推算出原始密码。这就代表你可以哈希另一串密码,来比较两者是否是同一个密码,但又无需知道原始的密码。如果你不将密码哈希,那么当未授权的第三者进入你的数据库时,所有用户的帐号

  • 我是在阅读了一些关于php中会话管理的主题后开始进行安全讨论的,请查看:https://paragonie.com/blog/2015/04/secure-authentication-php-with-long-termer-persistence#title.2 引自章节:胡椒还是不胡椒? 一个更好的解决方案是,在将散列插入数据库之前对其进行加密,如果使用硬件分离,这种解决方案尤其有用。有了这

  • 问题内容: 我正在寻找一种使用mongoose将帐户保存到MongoDB的好方法。 我的问题是:密码是异步哈希的。设置器将无法在这里工作,因为它只能同步工作。 我考虑了两种方法: 创建模型的实例,并将其保存在哈希函数的回调中。 在“保存”上创建一个预钩子 这个问题有什么好的解决办法吗? 问题答案: mongodb博客上有一篇很棒的文章,详细介绍了如何实现用户身份验证。 http://blog.mo

  • 多亏了最近一篇文章中的一些好建议,我才从中实现了PBKDF2https://defuse.ca/php-pbkdf2.htm进入一个小的PHP图像库,我正在建设教自己一些PHP。 我知道您将salt和hash存储在数据库中,然后在用户输入密码时重新构建它们以匹配。我不明白的是,当上面网站上的validate_password函数为同一个密码生成不同的、唯一的salt时,它是如何工作的。 例如,我创

  • 我用哈希法通过了一个密码 这将密码作为哈希值存储到数据库中。但是当我试图通过 无论密码是否正确,它都会告诉我密码是正确的。有没有办法解决这个问题,所以我可以散列密码,但登录时输入(非散列)密码。

  • 行动时间 - 哈希我们的密码 我们将在此部分中使用更安全的哈希密码AVP替换用户文件中的Cleartext-Password AVP。 关于如何创建和呈现散列密码似乎存在一般性的混淆。 我们将帮助您澄清此问题,以便为每种格式生成工作哈希值。 OpenLDAP常见问题解答是帮助我们处理哈希值的有价值的URL: http://www.openldap.org/faq/data/cache/419.ht

  • 我使用以下代码使用PBKDF2对密码进行哈希: 如何验证身份验证的密码?看来我需要拿到用来哈希密码的盐。我怎么拿到?请注意,我没有使用单独的字段来存储哈希。数据库中只存储散列密码。

  • 问题内容: 我需要解密密码。密码已使用功能加密。 现在,我们假设它存储在数据库中(有一个“用户”表,其中包含用户名,密码等),我需要登录:我必须查看用户输入的密码是否与存储在其中的加密密码匹配。数据库。 这是SQL代码… …但未加密,因此不等于表用户的密码字段中存储的内容… 所以,有一个使用?后解密的功能。还是应该更改我的加密方法?或者还有什么? 问题答案: Bcrypt是一种单向哈希算法,您无法