BCrypt 在我的 Spring Security 项目中(Spring security)

Сти*_*йтс -1 java spring spring-security jakarta-ee

我该如何进行加密。这样在数据库中它就不会显示用户密码。我现在保存在数据库中 - 登录名和密码,用户角色。我需要密码必须在数据库中加密(BCrypt)

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/admin/**").hasRole("ADMIN")
                .antMatchers("/user/**").hasRole("USER")
                .antMatchers("/**").permitAll()
                .and()
                .formLogin()
                .loginPage("/login")
                .defaultSuccessUrl("/allStudents")
                .and()
                .logout()
                .and()
                .csrf().disable();
    }

    @Bean
    public PasswordEncoder weDoNotWantEncryption() {
        return new PasswordEncoder() {
            @Override
            public String encode(CharSequence rawPassword) {
                return rawPassword.toString();
            }

            @Override
            public boolean matches(CharSequence rawPassword, String encodedPassword) {
                return rawPassword.toString().equals(encodedPassword);
            }
        };
    }

}
Run Code Online (Sandbox Code Playgroud)

cam*_*024 5

非常简单 - 只需将您的weDoNotWantEncryption()函数替换为返回 BCrypt 实例的函数:

@Bean
public PasswordEncoder passwordEncoder() {
    return new BCryptPasswordEncoder();
}
Run Code Online (Sandbox Code Playgroud)

BCryptPasswordEncoder实现PasswordEncoder(顾名思义),因此已经为encode()和定义了很好的方法matches()

请注意,这(当然)会使当前数据库中的任何密码都无法使用,尽管鉴于这些密码是以明文形式存储的,我假设(并希望/祈祷)这是在测试环境中,而不是在生产环境中。

  • 这不会更改任何现有密码。不过,请尝试添加新密码,它应该以 BCrypt 格式显示。Spring 中的密码编码器用于在将密码放入数据库时​​对密码进行哈希处理。`BCryptPasswordEncoder.encode()` 在数据库存储操作期间被调用,因此您不应该在数据库中看到任何差异。(仅供参考,如果进行测试,您可以将 ddl 设置为“create”以在每次运行时设置一个新数据库,这将避免这些错误。 (2认同)