Spring Boot中替代已废弃NoOpPasswordEncoder的无加密认证方案
替代废弃的NoOpPasswordEncoder实现明文PIN认证方案
有两种可行方案替代废弃的NoOpPasswordEncoder,同时满足你数据库明文存储PIN且不加前缀的需求:
方案一:使用DelegatingPasswordEncoder指定默认编码为noop
Spring Security推荐使用DelegatingPasswordEncoder作为密码编码器的统一入口,你可以配置它默认采用明文匹配逻辑,无需修改数据库里的PIN存储格式:
@Bean public PasswordEncoder passwordEncoder() { // 定义编码映射,这里仅需配置noop Map<String, PasswordEncoder> encoders = new HashMap<>(); encoders.put("noop", NoOpPasswordEncoder.getInstance()); // 第二个参数设置默认编码器为noop return new DelegatingPasswordEncoder("noop", encoders); }
这个方案贴合Spring Security的最佳实践,后续如果要切换加密方式,仅需修改编码器映射和数据库存储格式即可。
方案二:自定义明文匹配的PasswordEncoder
如果不想依赖已废弃的NoOpPasswordEncoder,也可以自己实现一个简单的PasswordEncoder,直接做字符串相等匹配:
@Bean public PasswordEncoder passwordEncoder() { return new PasswordEncoder() { @Override public String encode(CharSequence rawPassword) { // 明文存储,直接返回原始PIN return rawPassword.toString(); } @Override public boolean matches(CharSequence rawPassword, String encodedPassword) { // 直接比较输入的原始PIN和数据库存储的明文 return rawPassword.toString().equals(encodedPassword); } }; }
这个实现完全自定义,不依赖废弃类,逻辑简单直接。
重要提醒
生产环境绝对禁止使用明文存储密码/PIN,以上方案仅适用于测试或特殊场景。正式环境请使用强哈希算法(如BCrypt、Argon2),示例如下:
@Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); }
同时需要修改数据库存储逻辑,将PIN通过BCryptPasswordEncoder.encode()加密后再存储,无需加前缀,Spring Security会自动识别BCrypt格式的哈希值。
内容的提问来源于stack exchange,提问作者tarun swaroop
相关产品推荐
相关产品推荐

