할 일

  • 커스텀 로그인 페이지 만들기

 

  • 스프링 시큐리티 로그인/로그아웃 설정
        http.formLogin()
                .loginPage("/login").permitAll();

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

 

  • 스프링 시큐리티 로그인 기본값
    • username
    • password
    • POST “/login”

 

 

SecurityConfig Class

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

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

 

@GetMapping("/login")
    public String login() {
        // StringBoot의 ViewController로 줄일 수 있음
        return "login";
        // ViewResolver에 의해 preifx templates/
        // surfix .html이 붙게 설정되어 있는 것임
    }

 

@Service
@RequiredArgsConstructor
public class AccountService implements UserDetailsService {
...

@Override
    public UserDetails loadUserByUsername(String emailOrNickname) throws UsernameNotFoundException {
        Account account = accountRepository.findByEmail(emailOrNickname);
        if (account == null) {
            account = accountRepository.findByNickname(emailOrNickname);
        }

        if (account == null) {
        // 이메일과 닉네임으로 검증 후 없으면 throw exception
            throw new UsernameNotFoundException(emailOrNickname);
        }
        
        // 이를 통과하면 유저는 있음 -> 유저 생성 후 리턴
        return new UserAccount(account);// principal에 해당하는 객체를 넘김
       
    }
    
    /*
    public UserAccount(Account account){
        super(account.getNickname(), account.getPassword(), List.of(new SimpleGrantedAuthority("ROLE_USER")));
        this.account = account;
    }
    */
    
    @Service 어노테이션으로 Bean을 등록했고
    UserDetailsService 타입의 Bean이 하나만 있다면 SpringSecurity에 추가적인 설정없이 
    UserDetailsService Bean을 가지고 로그인 로그아웃을 구현 할 수 있다.
    만약 PassWordEncoder가 여러개거나 UserdetailsService가 여러개라면 추가적인 설정이 필요