프로젝트 정리/경조사 가계부 프로젝트

#6 회원가입 로직 구현시 에러 해결

1. final 키워드를 붙이지 않아서 생성자가 생성되지 않은 문제

 

@RequiredArgsConstructor    // final이 붙거나 @NotNull 이 붙은 필드의 생성자를 자동 생성해주는 롬복 어노테이션
private final PasswordEncoder passwordEncoder; // final 키워드를 붙여줘야 생성자를 자동생성

 

2. security의 기능을 숙지하지 않아 생긴 문제

  • Login GetMapping 메서드 미 구현
  • 시큐리티 login 로직 실행을 위해 필요한 것들
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    //EnableWebSecurity -> 직접 스프링 시큐리티 설정을 하겠다는 어노테이션
    // websecurity 설정을 좀 손쉽게 하려면 WebSecurityConfigurerAdapter를 상속
    // 당장 사용한 이유 -> custom loginform 을 사용하기 위해
    
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // 원하는 특정 요청들을 authorize 체크를 하지 않도록 걸러낼 수 있음
        http.authorizeRequests()
                .mvcMatchers("/", "/login", "/sign-up", "/check-email-token",
                        "/email-login", "/login-by-email").permitAll()       // mvcMatchers로 해당 링크는 모두 허용한다.
                .mvcMatchers(HttpMethod.GET, "/profile/*").permitAll()      // profile 링크는 GET만 허용한다.
                .anyRequest().authenticated();                                          // 그 외 링크는 모두 인증해야 쓸 수 있다.
        http.formLogin()

                .loginPage("/login").permitAll();   // 로그인 페이지 URL에 인증과 무관하게 permitAll

        http.logout()
                .logoutSuccessUrl("/");

        http.rememberMe()
                .userDetailsService(accountService)
                .tokenRepository(tokenRepository());
        //rememberMe() session저장
    }
    
     // http.formLogin().loginPage("/login").permitAll(); 
     // -> 로그인(post) request를 받아 로그인 로직을 실행 이를 위해서는 UserDetailsService 를 구현해야함

 

public class AccountService implements UserDetailsService {
	@Transactional(readOnly = true)
    // 데이터 변경 X -> check -> 읽기 전용 트랜잭션 사용시 writeLock
    @Override
    public UserDetails loadUserByUsername(String emailOrNickname) throws UsernameNotFoundException {
        Account account = accountRepository.findByEmail(emailOrNickname);
        if (account == null) {
            account = accountRepository.findByNickname(emailOrNickname);
        }

        if (account == null) {
            throw new UsernameNotFoundException(emailOrNickname);
        }
        return new UserAccount(account);// principal에 해당하는 객체를 넘김
    }
    
    security의 login 로직을 위해서 구현해야 한다.
}

 

현재 진행상황은 회원가입과 로그인은 구현했으나 로그인 후 이메일 인증에서 에러가 났다.

 

이메일 인증 로직 해결해야함


 

TODO

1. 이메일 인증

2. 서드파티 로그인