개인 자료 정리 홈페이지 입니다.

Note > 스프링시큐리티 jwt 적용하기Authentication / AuthenticationManager/ DaoAuthenticationProvider By a3040, Published on Invalid Date

AuthenticationEntryPoint 인증정보를 요청하는 응답에 사용 이후 Login 페이지등으로 이동합니다.

사용자가 보낸 인증을 위한 정보(id/pwd)가 Authentication 에 담기게 됩니다.


AuthenticationManager 가 db에있는 정보와 보내온 인증정보를 비교해서 인증여부를 판단합니다.

authenticationManager.authenticate() 메서드에서는 DaoAuthenticationProvider 객체를 사용하여 DB에서 사용자 정보를 가져와 인증을 처리하고, additionalAuthenticationChecks() 메서드에서 로그인 폼 정보와 DB 정보를 비교합니다.


@Service
public class JwtUserDetailsService implements UserDetailsService {
...
    
    @Override
    public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException {
        Member member = memberRepository.findByEmail(email);
        if (member == null) {
            throw new UsernameNotFoundException("User not found with email: " + email);
        }
    return new User(member.getEmail(), member.getPassword(), Arrays.asList(new SimpleGrantedAuthority("ROLE_ADMIN")));
        }
    



@Configuration
public class SecurityConfig {
...
    
    @Autowired
    private JwtUserDetailsService jwtUserDetailsService;
    @Bean
    public DaoAuthenticationProvider daoAuthenticationProvider() {
        DaoAuthenticationProvider provider = new DaoAuthenticationProvider(); 
        provider.setPasswordEncoder(new PlaintextPasswordEncoder());//일반 문자열비교
        // provider.setPasswordEncoder(new BCryptPasswordEncoder());
        provider.setUserDetailsService(jwtUserDetailsService);
        return provider;
    }


    @Bean
    public SecurityFilterChain jwtSecurityFilterChain(HttpSecurity http) throws Exception {
        http.csrf().disable()
                .headers()
                .frameOptions().disable();
        http.cors()
        .configurationSource(corsConfigurationSource());
        http.authenticationProvider(daoAuthenticationProvider());
        ....
}

class PlaintextPasswordEncoder implements PasswordEncoder {
    @Override
    public String encode(CharSequence rawPassword) {
        return rawPassword.toString();
    }

    @Override
    public boolean matches(CharSequence rawPassword, String encodedPassword) {
        return rawPassword.toString().equals(encodedPassword);
    }
}