on
[Spring Boot] 2. Security 로그인
[Spring Boot] 2. Security 로그인
반응형
작업의 루틴은 다음과 같다.
시큐리티가 로그인을 진행시키면 UserDetails타입의 객체를 실행한다. 로그인 진행이 완료되면 시큐리티 session을 생성하고 Security ContextHolder라는 키 값으로 세션 정보 저장한다. 키에 대한 값으로 들어가는 오브젝트 타입은 Authentication이다. Authentication 안에는 User(UserDetails타입) 정보가 있어야 됨.
1. 시큐리티가 로그인을 진행시키면 실행 될 UserDetails타입의 클래스를 생성하기 위해 UserDetails를 implements한다.
public class PrincipalDetails implements UserDetails { private Member member; public PrincipalDetails(Member member) { this.member = member; } @Override public Collection getAuthorities() { Collection collection = new ArrayList<>(); collection.add(new GrantedAuthority() { @Override public String getAuthority() { return member.getRole(); } }); return collection; } @Override public String getPassword() { return member.getPassword(); } @Override public String getUsername() { return member.getUsername(); } @Override public boolean isAccountNonExpired() { return true; } @Override public boolean isAccountNonLocked() { return true; } @Override public boolean isCredentialsNonExpired() { return true; } @Override public boolean isEnabled() { return true; } }
getAuthorities() : 해당 유저의 권한을 리턴한다. 리턴 타입이 GrantedAuthority이므로 Collection을 이용해서 반환 타입을 설정
isAccountNonExpired() : 계정이 만료됐는지 체크
isCredentialsNonExpired() : 비밀번호를 오래 사용했는지 체크
isEnabled() : 계정의 활성화 여부를 체크
2. 로그인 요청이 오면 자동으로 UserDetailsService 타입으로 IoC되어 있는 loadUserByUsername 함수가 실행되므로 UserDetailsService를 implements하는 서비스 클래스 생성
@Service public class PrincipalDetailsService implements UserDetailsService { @Autowired private JpaMemberRepository jpaMemberRepository; @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { Member memberEntity = jpaMemberRepository.findByUsername(username); if(memberEntity != null) { return new PrincipalDetails(memberEntity); } return null; } }
파라미터로 받는 username은 form에서 받는 input태그와 name이 같아야 한다.
다를 경우 시큐리티 config 파일에서 수정할 수 있다. (userNameParameter()이용)
결국 Security Session 안 -> Authentication객체 안 -> UserDetails(PrincipalDetails) 형식이 완성되고 시큐리티에 의해 로그인이 완료된다.
-
* 해당 글은 인프런에 게시된 '최주호'님의 강의를 듣고 개인적으로 정리한 글입니다.
강의 출처 : https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-%EC%8B%9C%ED%81%90%EB%A6%AC%ED%8B%B0
from http://black-mint.tistory.com/16 by ccl(A) rewrite - 2021-12-17 17:01:33