You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 01:50:58