728x90
작업의 루틴은 다음과 같다.
- 시큐리티가 로그인을 진행시키면 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<? extends GrantedAuthority> getAuthorities() {
Collection<GrantedAuthority> 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) 형식이 완성되고 시큐리티에 의해 로그인이 완료된다.
-
* 해당 글은 인프런에 게시된 '최주호'님의 강의를 듣고 개인적으로 정리한 글입니다.
'Web > SpringBoot' 카테고리의 다른 글
[SpringBoot] 4. Spring Security 로그인 객체 가져오기 (+ 로그인 초기화) (0) | 2021.12.18 |
---|---|
[Spring Boot] 3. Spring Security 권한 설정 (0) | 2021.12.17 |
[Spring Boot] Entity, DTO, VO 정의 (0) | 2021.12.17 |
[Spring Boot] JPA defalut 값 설정하기 (@DynamicInsert, @DynamicUpdate) (0) | 2021.12.17 |
[Spring Boot] 1. Spring Security 사용 설정, 비밀번호 인코딩 (0) | 2021.12.16 |