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);
}
}