[エラー]ここではID「null」のPasswordEncoderはマッピングされません


エラーバックグラウンド


Spring Boot Securityでログイン
  • エラー内容
    There is no PasswordEncoder mapped for the id "null"
  • 
    java.lang.IllegalArgumentException: There is no PasswordEncoder mapped for the id "null"
    	at org.springframework.security.crypto.password.DelegatingPasswordEncoder$UnmappedIdPasswordEncoder.matches(DelegatingPasswordEncoder.java:254) ~[spring-security-crypto-5.6.2.jar:5.6.2]
    	at org.springframework.security.crypto.password.DelegatingPasswordEncoder.matches(DelegatingPasswordEncoder.java:202) ~[spring-security-crypto-5.6.2.jar:5.6.2]
    	at org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter$LazyPasswordEncoder.matches(WebSecurityConfigurerAdapter.java:595) ~[spring-security-config-5.6.2.jar:5.6.2]
    	at org.springframework.security.authentication.dao.DaoAuthenticationProvider.additionalAuthenticationChecks(DaoAuthenticationProv
  • パスワードを含むサービスコード
  • 
    @Service
    public class CustomUserDetailsService implements UserDetailsService {
        private static final Logger logger = LoggerFactory.getLogger(CustomUserDetailsService.class);
        private final UserRepository userRepository;
    
        public CustomUserDetailsService(
                @Autowired UserRepository userRepository) {
            this.userRepository = userRepository;
            final UserEntity testUserEntity = new UserEntity();
            testUserEntity.setUsername("entity_user");
            testUserEntity.setPassword("test1pass");
            this.userRepository.save(testUserEntity);
        }
    
        @Override
        public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
            final UserEntity userEntity = userRepository.findByUsername(username);
            return new User(username, userEntity.getPassword(), new ArrayList<>());
        }
    }
    

    エラーの原因


    パスワードを保存するには暗号化プロセスが必要です!
    パスワードエンコーダを設定する必要があります
    共通インタフェースPasswordEncoderの使用

    PasswordEncoderとは?


    パスワードの一方向暗号化をサポートするインタフェースであって、Spring Securityにパスワードを安全に記憶することができる.
    会員が市場に入ると、平紋でDBにパスワードを保存することはお勧めしません.したがって、PasswordEncoderを使用して安全に保存するための一方向暗号化をサポートします.

    修正されたコード

    
    @Service
    public class CustomUserDetailsService implements UserDetailsService {
        private static final Logger logger = LoggerFactory.getLogger(CustomUserDetailsService.class);
        private final UserRepository userRepository;
        private final PasswordEncoder passwordEncoder; //추가
    
        public CustomUserDetailsService(
                @Autowired UserRepository userRepository,
                @Autowired PasswordEncoder passwordEncoder //추가
        ) {
            this.userRepository = userRepository;
            this.passwordEncoder = passwordEncoder;
            final UserEntity testUserEntity = new UserEntity();
            testUserEntity.setUsername("entity_user");
            testUserEntity.setPassword(passwordEncoder.encode("test1pass")); //바꿈
            this.userRepository.save(testUserEntity);
        }
    
        @Override
        public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
            final UserEntity userEntity = userRepository.findByUsername(username);
            return new User(username, userEntity.getPassword(), new ArrayList<>());
        }
    }