[개발] 로그인/로그아웃 기능 구현
필기자
2022-10-26 12:41
6,187
0
본문
kr/hull/shop/service/MemberService.java 수정
UserDetailsService 인터페이스 상속 및 메소드 구현
@Service
@Transactional
@RequiredArgsConstructor //bean 주입방법 생성자 final member, @NonNull member 생성자 생성함
public class MemberService implements UserDetailsService{
private final MemberRepository memberRepository;
public Member saveMember(Member member){
validateDuplicateMember(member);
return memberRepository.save(member);
}
private void validateDuplicateMember(Member member){
Member findMember = memberRepository.findByEmail(member.getEmail());
if(findMember != null){
throw new IllegalStateException("이미 가입된 회원입니다."); // 예외 처리
}
}
@Override
public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException {
Member member = memberRepository.findByEmail(email);
if(member == null){
throw new UsernameNotFoundException(email);
}
return User.builder()
.username(member.getEmail())
.password(member.getPassword())
.roles(member.getRole().toString())
.build();
}
}
Securiry 인증순서
1. UserDetailsService에서 사용자의 정보를 조회, UserDetails로 반환하여 AuthenticationsProvider에게 전달
UserDetailsService의 loadUserByUserName(string) 메소드로 db에서 사용자 정보를 조회 후 UserDetails객체로 변환
2. ProviderManager에서 AuthenticationProvider에게 인증을 위임
AuthenticationProvider에서는 UserDetailsService, UserDetails, PasswordEncoding등을 이용하여 조회한 사용자와 접속사용자 비교 후 인증처리
3. 인증에 성공하면 Authentication 객체를 리턴. 리턴한 Authentication은 SecurityContext에 저장, 클라이언트에 session id(JSESSIONID)를 전달.
4. 클라이언트는 전달받은 JSESSIONID로 최종 인증 완료
kr/hull/shop/config/CustomAuthenticationEntryPoint.java
public class CustomAuthenticationEntryPoint implements AuthenticationEntryPoint {
@Override
public void commence(HttpServletRequest request, HttpServletResponse response,
AuthenticationException authException) throws IOException, ServletException {
response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized");
//LOGGER.info("가입되지 않은 사용자 접근");
//response.sendRedirect("/signin");
}
}
kr/hull/shop/config/SecurityConfig.java 수정
@Configuration
@EnableWebSecurity
public class SecurityConfig {
// Spring Security 5.7.0-M2 부터 기존 WebSecurityConfigureAdapter 방식에서 SecurityFilterChain 으로 변경 권장
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
// 인증이 필요한 요청폼 설정
http.formLogin()
.loginPage("/members/login")
.defaultSuccessUrl("/")
.usernameParameter("email")
.failureUrl("/members/login/error")
.and()
.logout()
.logoutRequestMatcher(new AntPathRequestMatcher("/members/logout"))
.logoutSuccessUrl("/")
;
//인증 실패시 라우팅
http.exceptionHandling()
.authenticationEntryPoint(new CustomAuthenticationEntryPoint())
;
return http.build();
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
댓글목록0