Spring Boot 3中permitAll()失效问题及Postman认证疑问
问题解决指南
1. 修复"Encoded password does not look like BCrypt"错误
你的密码存储格式存在问题:
- BCrypt哈希值本身以
$2a$/$2b$/$2y$开头,不需要额外添加{bcrypt}前缀。当前存储的{bcrypt}$2a$12$2mERuojKpXO8N2qX2OXmBOAIuVM6pSImxlcrrJXHNyI3iowgHe5Zi会被BCryptPasswordEncoder判定为无效格式,因为它不符合标准BCrypt哈希的开头规则。 - 修正方式:将MySQL users表中password字段的值改为去掉
{bcrypt}前缀的部分,即$2a$12$2mERuojKpXO8N2qX2OXmBOAIuVM6pSImxlcrrJXHNyI3iowgHe5Zi。
若确实需要保留前缀(比如兼容多种加密算法),则需配置DelegatingPasswordEncoder来识别前缀,示例代码:
@Bean public PasswordEncoder passwordEncoder() { Map<String, PasswordEncoder> encoders = new HashMap<>(); encoders.put("bcrypt", new BCryptPasswordEncoder()); return new DelegatingPasswordEncoder("bcrypt", encoders); }
但更推荐直接存储纯BCrypt哈希值,减少额外配置成本。
2. 让permitAll()对POST请求的/api/auth/**生效
检查你的SecurityFilterChain配置,确保规则顺序和请求匹配逻辑正确:
- 规则顺序:Spring Security按配置顺序匹配规则,必须将
/api/auth/**的放行规则放在所有需要认证的规则之前。 - 明确指定POST方法,避免匹配所有请求类型。
正确配置示例:
@Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http .authorizeHttpRequests(auth -> auth // 优先放行POST请求的/api/auth/**端点 .requestMatchers(HttpMethod.POST, "/api/auth/**").permitAll() // 其余所有请求需认证 .anyRequest().authenticated() ) .formLogin(form -> form.permitAll()) // 若使用表单登录则保留,其他认证方式按需调整 .csrf(csrf -> csrf.disable()); // 开发环境可临时禁用,生产环境按需配置CSRF防护 return http.build(); }
注意事项:
- 确保
requestMatchers的路径和请求方法与实际端点完全匹配。 - 若启用CSRF保护,POST请求需携带CSRF令牌,否则会被拦截。
3. Postman中发送认证密码的方法
根据你的认证方式选择对应操作:
表单登录场景
- 在Postman中选择
POST方法,输入认证端点(如/api/auth/login)。 - 切换到
Body标签,选择x-www-form-urlencoded格式。 - 添加两个键值对:
username: 你的用户名password: 明文密码(不是加密后的哈希值)
- 点击发送即可。
Basic认证场景
- 在Postman中切换到
Authorization标签,类型选择Basic Auth。 - 输入用户名和明文密码,Postman会自动将其编码为
Base64(username:password)并添加到请求头的Authorization字段中。 - 发送请求即可。
内容的提问来源于stack exchange,提问作者The Beast
相关产品推荐
相关产品推荐

