Java Spring Security - 사용자.withDefaultPasswordEncoder()는 권장되지 않습니다.
저는 java spring security에 대해 잘 모르기 때문에 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);
}
}
내부userDetailService()메서드, 사용withDefaultPasswordEncoder()이것은 현재 문서에서 볼 수 있듯이 권장되지 않습니다.with Default Password Encoder()
아쉽게도 이 튜토리얼을 완료하려면 권장되지 않는 방법을 사용해야 합니다.가능하다면 누군가 이에 대한 대안을 제시해 줄 수 있을까요?
감사합니다!
메모: 오류 스크린샷 몇 장과 그라들 파일을 첨부했습니다.


편집: 오래된 답변을 삭제하고 질문을 잘못 이해했습니다.여기 새로운 것이 있습니다.
User.withDefaultPasswordEncoder()데모용으로도 사용할 수 있습니다.사용하지 않아도 됩니다만, 실제 가동에서는, 소스코드에 플레인 텍스트 패스워드를 설정하지 말아 주세요.
현재를 사용하는 대신 해야 할 일userDetailsService()method는 다음과 같습니다.
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();
}
어디에ENCODED_PASSWORD이secret123BCrypt로 부호화됩니다.다음과 같이 프로그래밍 방식으로 인코딩할 수도 있습니다.passwordEncoder().encode("secret123").
이렇게 하면 코드를 공개 저장소로 밀어 넣어도 암호를 알 수 없습니다.ENCODED_PASSWORD에는, 암호의 부호화(및 해시화) 버전만 표시됩니다.플레인 텍스트버전은 표시되지 않습니다.다만, 이 점을 알고 있기 때문입니다.$2a$10$AIUufK8g6EFhBcumRRV2L.AQNz3Bjp7oDQVFiO5JJMBFZQ6x2/R/2실제로는 스트링의 부호화된 패스워드입니다.secret123다른 사용자는 그렇지 않지만 메모리 내 사용자는 자격 증명을 가지고 있습니다.user:secret123타협하지 않을 겁니다
예를 들어 정적 변수에 남겨둔 채로 사용하고 있습니다.
봄 보안 5.7.3 Web Security Configurer Adapter는 폐지되므로 User Details Service 인터페이스를 제공해야 합니다.
샘플코드
@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();
}
}
passwordEncoder.encode()를 사용하면 다음과 같습니다.
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.passwordEncoder(passwordEncoder())
.withUser("user")
.password(passwordEncoder().encode("miClave"))
.roles("USER");
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
withDefaultPasswordEncoder() 메서드는 현재 PasswordEncoder 구현을 받아들이는 passwordEncoder()를 위해 폐지되었습니다.bcrypt 또는 scrypt와 같은 보다 강력한 비밀번호 인코딩 메커니즘을 사용하는 것이 좋습니다.bcrypt를 사용하려면 다음 작업을 수행합니다.
package com.example.securingweb;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
@EnableWebSecurity
public class WebSecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests((requests) -> requests
.requestMatchers("/", "/home").permitAll()
.anyRequest().authenticated()
)
.formLogin((form) -> form
.loginPage("/login")
.permitAll()
)
.logout((logout) -> logout.permitAll());
return http.build();
}
@Bean
public UserDetailsService userDetailsService() {
UserDetails user =
User.builder()
.username("user")
.password(passwordEncoder().encode("password"))
.roles("USER")
.build();
return new InMemoryUserDetailsManager(user);
}
@Bean
public BCryptPasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
다음 코드는 WebSecurityConfig.java 파일http://https://spring.io/guides/gs/securing-web/ 의 새로운 실장 코드입니다.
언급URL : https://stackoverflow.com/questions/49847791/java-spring-security-user-withdefaultpasswordencoder-is-deprecated
'programing' 카테고리의 다른 글
| Wordpress 페이지에 Angular 앱을 삽입하려면 어떻게 해야 합니까? (0) | 2023.03.11 |
|---|---|
| ng-repeat 내에서 Ng-click이 작동하지 않음 (0) | 2023.03.11 |
| AngularJs의 날짜 필터별 내림차순 (0) | 2023.03.11 |
| Redux에서는 상세 복사가 필요합니까? (0) | 2023.03.11 |
| 왜 잭슨 2는 첫 번째 대문자를 인식하지 못하는가? 낙타의 경우 단어 길이가 한 글자밖에 되지 않는데? (0) | 2023.03.11 |