sam*_*n71 15 java spring spring-mvc spring-security spring-boot
我是java spring安全的新手,并且遵循Spring.io 教程指南.作为其中的一部分,我WebSecurityConfig根据需要编辑了课程:
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/", "/home").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.permitAll()
.and()
.logout()
.permitAll();
}
@Bean
@Override
public UserDetailsService userDetailsService() {
UserDetails user =
User.withDefaultPasswordEncoder()
.username("user")
.password("password")
.roles("USER")
.build();
return new InMemoryUserDetailsManager(user);
}
}
Run Code Online (Sandbox Code Playgroud)
在该userDetailService()方法中,它使用withDefaultPasswordEncoder()现在已弃用,如文档中所示:withDefaultPasswordEncoder()
不幸的是,我没有找到替代方案,在不使用弃用方法的情况下完成本教程.如果可能,有人能为此提供替代方案吗?
谢谢!
注意:我附上了几个错误的屏幕截图,以及我的gradle文件
Twi*_*wiN 25
编辑:删除旧答案,误解了这个问题.这是新的:
User.withDefaultPasswordEncoder() 仍然可以用于演示,你不必担心这是你正在做什么 - 即使它已被弃用 - 但在生产中,你的源代码中不应该有纯文本密码.
你应该做什么而不是使用当前的userDetailsService()方法如下:
private static final String ENCODED_PASSWORD = "$2a$10$AIUufK8g6EFhBcumRRV2L.AQNz3Bjp7oDQVFiO5JJMBFZQ6x2/R/2";
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.passwordEncoder(passwordEncoder())
.withUser("user").password(ENCODED_PASSWORD).roles("USER");
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
Run Code Online (Sandbox Code Playgroud)
凡ENCODED_PASSWORD被secret123编码与BCrypt.您也可以通过编程方式对其进行编码:passwordEncoder().encode("secret123").
这样,即使您将代码推送到公共存储库,人们也不会知道密码,因为ENCODED_PASSWORD只显示密码的编码版本而不是纯文本版本,但是因为您知道这$2a$10$AIUufK8g6EFhBcumRRV2L.AQNz3Bjp7oDQVFiO5JJMBFZQ6x2/R/2实际上是字符串的编码密码secret123而其他人则没有,您的凭证内存用户user:secret123不会受到损害.
请注意,为了示例,我将其保留在静态变量中.
在 Spring Security 5.7.3 中,WebSecurityConfigurerAdapter 将被弃用,因此我们必须 提供 UserDetailsService 接口的 bean。
示例代码
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class WebSecurity {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http.formLogin(form -> {
form.loginPage("/login")
.permitAll();
}).authorizeRequests();
return http.build();
}
@Bean
@Description("In memory Userdetails service registered since DB doesn't have user table ")
public UserDetailsService users() {
// The builder will ensure the passwords are encoded before saving in memory
UserDetails user = User.builder()
.username("user")
.password("password")
.roles("USER")
.build();
UserDetails admin = User.builder()
.username("admin")
.password("password")
.roles("USER", "ADMIN")
.build();
return new InMemoryUserDetailsManager(user, admin);
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9765 次 |
| 最近记录: |