import statements;
@Configuration
public class AppSecurity {
@Autowired
private DataSource dataSource;
@Bean
public UserDetailsService userDetailsService() {
JdbcUserDetailsManager userDetailsManager = new JdbcUserDetailsManager(dataSource);
userDetailsManager.setUsersByUsernameQuery("SELECT mobile, pin, 1 AS enabled FROM users WHERE mobile = ?");
userDetailsManager.setAuthoritiesByUsernameQuery("SELECT mobile, 'ROLE_USER' FROM users WHERE mobile = ?");
return userDetailsManager;
}
@Bean
public PasswordEncoder passwordEncoder() {
return NoOpPasswordEncoder.getInstance();
}
@Bean
public SecurityFilterChain filter(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(configure ->
configure.requestMatchers(HttpMethod.POST, "/api/**")
.hasRole("USER")
.requestMatchers(HttpMethod.GET, "/api/**")
.hasRole("USER")
);
http.httpBasic(Customizer.withDefaults());
return http.build();
}
}
这是我的配置类
此配置类允许用户使用其 mobileno 和 pin 登录。 我将密码存储为纯文本(noop)。 我将密码存储在没有加密 ID 的数据库中(例如:{noop}、{bcrypt} ...)
但是
@Bean
public PasswordEncoder passwordEncoder() {
return NoOpPasswordEncoder.getInstance();
}
Intellij 显示 NoOpPasswordEncoder 已弃用 还有其他方法可以实现身份验证吗
注意:我存储的密码没有加密 ID,即。 “0000”不是“{noop}0000”
永远不要以纯文本形式存储密码...来自 NoOpPasswordEncoder 的文档:
此密码编码器不安全。请改用自适应单向函数,例如 BCryptPasswordEncoder、Pbkdf2PasswordEncoder 或 SCryptPasswordEncoder。更好的是使用支持密码升级的 DelegatingPasswordEncoder。目前还没有计划取消这种支持。不推荐使用它来表明这是一个遗留实现,并且使用它被认为是不安全的。
如果你想摆脱警告,你总是可以自己制作 no op 实现,但这将是规避问题,而不是解决问题。按照文档中的建议,使用 DelegatingPasswordEncoder 来代替。
{noop}
前缀,或配置委托编码器以考虑无操作的缺失前缀 - 请参阅 setDefaultPasswordEncoderForMatches()。