如何在不使用密码编码的情况下使用Spring Security?

Arj*_*jun 4 java spring spring-security spring-data-jpa spring-boot

我正在尝试学习Spring安全性。我曾BCryptPasswordEncoder先将用户密码编码,然后再保存到数据库中

@Override
    public void saveUser(User user) {
        user.setPassword(bCryptPasswordEncoder.encode(user.getPassword()));
        user.setActive(1);
        Role userRole = roleRepository.findByRole("ADMIN");
        user.setRoles(new HashSet<Role>(Arrays.asList(userRole)));
        userRepository.save(user);
    }
Run Code Online (Sandbox Code Playgroud)

然后在身份验证期间也使用它,并且用户已按预期进行身份验证。

@Override
    protected void configure(AuthenticationManagerBuilder auth)
            throws Exception {
        auth.
            jdbcAuthentication()
                .usersByUsernameQuery(usersQuery)
                .authoritiesByUsernameQuery(rolesQuery)
                .dataSource(dataSource).passwordEncoder(bCryptPasswordEncoder);
    }
Run Code Online (Sandbox Code Playgroud)

然后我.passwordEncoder(bCryptPasswordEncoder);configure()方法中删除,仍然使用密码编码的用户仍成功通过身份验证。

然后,我从saveUser()configure()方法中都删除了密码编码器,并将a持久化User到数据库中(即不使用密码编码),并尝试访问经过身份验证的页面,但是我得到了AccessedDeniedException

但是即使我passwordEncoder()configure()方法中删除,使用编码密码的用户仍然可以通过身份验证。为什么会这样呢?

默认情况下,spring security是否在身份验证期间使用密码编码器?

如果是这样,如何在没有密码编码的情况下使用spring security?

小智 8

也许您可以实现此简单代码来逃避Spring Encoder

public class PasswordEnconderTest implements PasswordEncoder {
    @Override
    public String encode(CharSequence charSequence) {
        return charSequence.toString();
    }

    @Override
    public boolean matches(CharSequence charSequence, String s) {
        return charSequence.toString().equals(s);
    }
}
Run Code Online (Sandbox Code Playgroud)

并添加您的WebSecurityConfig:

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

不建议这样做,但是您可以实施


M. *_*num 6

使用Spring Security 5时,始终启用密码加密。默认使用的加密为bcrypt。Spring Security 5的巧妙之处在于,它实际上允许您在密码中指定用于创建has的加密。

为此,请参阅《Spring Security参考指南》中的“ 密码存储格式 ”。简而言之,它允许您为算法的众所周知的密钥添加密码前缀。存储格式为{<encryption>}<your-password-hash>

当不使用任何东西时,它会变成{noop}your-password(将使用NoOpPasswordEncoder{bcrypt}$a2......将使用BcryptPasswordEncoder。)。有几种开箱即用的算法支持,但是您也可以定义自己的算法。

要定义自己的内容,请创建自己的内容,PasswordEncoder并使用进行注册DelegatingPasswordEncoder