programing

Java Spring Security - 사용자.withDefaultPasswordEncoder()는 권장되지 않습니다.

fastcode 2023. 3. 11. 09:33
반응형

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()

아쉽게도 이 튜토리얼을 완료하려면 권장되지 않는 방법을 사용해야 합니다.가능하다면 누군가 이에 대한 대안을 제시해 줄 수 있을까요?

감사합니다!

메모: 오류 스크린샷 몇 장과 그라들 파일을 첨부했습니다.

이미지 1: 받은 오류

이미지 2: 내 그래들 파일

편집: 오래된 답변을 삭제하고 질문을 잘못 이해했습니다.여기 새로운 것이 있습니다.

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_PASSWORDsecret123BCrypt로 부호화됩니다.다음과 같이 프로그래밍 방식으로 인코딩할 수도 있습니다.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

반응형