인증
Security를 통해 인증을 진행하는 방법은 사용자가 Login 페이지를 통해 아이디, 비밀번호를 POST 요청시 Spring Security가 데이터베이스에 저장된 회원의 정보를 조회 후 비밀번호를 검증하고 서버 세션 저장소에 해당 아이디에 대한 세션을 저장한다.
UserDetails
Spring Security에서 사용자의 정보를 담는 인터페이스이다.
Spring Security에서 사용자의 정보를 불러오기 위해서 구현해야 하는 인터페이스로 기본 오버라이드 메서들을 구현해야 한다.
메소드 | 리턴 타입 | 설명 | 기본값 |
getAuthorities() | Collection<? extends GrantedAuthority> | 계정의 권한 목록을 리턴 | |
getPassword() | String | 계정의 비밀번호를 리턴 | |
getUsername() | String | 계정의 고유한 값을 리턴(pk값, 중복이 없는 이메일) | |
isAccountNonExpired() | boolean | 계정의 만료 여부 리턴 | true (만료 안됨) |
isAccountNonLocked() | boolean | 계정의 잠김 여부 리턴 | true (잠기지 않음) |
isCredentiallsNonExpired() | boolean | 비밀번호 만료 여부 리턴 | true (만료 안됨) |
isEnabled() | boolean | 계정의 활성화 여부 리턴 | true (활성화 됨) |
중요한 메소드는 getUsername()이다.
username은 계정의 고유한 값인데 정책에 따라서 중복이 될 수도 있기에 user_table의 pk값을 넘겨준다.
package com.gdy.springsecurity.Dto;
import com.gdy.springsecurity.Entity.MemberEntity;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import java.util.ArrayList;
import java.util.Collection;
public class CustomMemberDetails implements UserDetails {
private MemberEntity memberEntity; //데이터가 왔을 때 받을 수 있는 필드 생성해야함
public CustomMemberDetails(MemberEntity memberEntity){
this.memberEntity = memberEntity;
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() { //계정의 권한 목록을 리턴
Collection<GrantedAuthority> collection = new ArrayList<>();
collection.add(new GrantedAuthority() {
@Override
public String getAuthority() {
return memberEntity.getRole();
}
});
return collection;
}
@Override
public String getPassword() { // 계정의 비밀번호를 리턴
return memberEntity.getPassword();
}
@Override
public String getUsername() { //계정의 고유한 값을 리턴
return memberEntity.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;
}
}
UserDetailsService
Spring Security에서 유저의 정보를 가져오는 인터페이스이다.
Spring Security에서 유저의 정보를 불러오기 위해서 구현해야하는 인터페이스로 기본 오버라이드 메서드를 구현해야 한다.
메소드 | 리턴 타입 | 설명 |
loadUserByUsername | UserDetails | 유저의 정보를 불러와서 UserDetails로 리턴 |
package com.gdy.springsecurity.Service;
import com.gdy.springsecurity.Dto.CustomMemberDetails;
import com.gdy.springsecurity.Entity.MemberEntity;
import com.gdy.springsecurity.Repository.MemberRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
@Service
@RequiredArgsConstructor
public class CustomMemberDetailsService implements UserDetailsService {
private final MemberRepository memberRepository;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
//로그인을 하면 SecurityConfig가 매개변수 username에 전달해준다.
MemberEntity byUsername = memberRepository.findByUsername(username);
if(byUsername != null){
return new CustomMemberDetails(byUsername); //UserDetails는 dto에 해당함
}
return null;
}
}
'🌠Development > SpringBoot' 카테고리의 다른 글
[Spring Security] 09 - 세션 설정 (0) | 2024.02.26 |
---|---|
[Spring Securitiy] 08 - 세션 정보 확인 (0) | 2024.02.25 |
[Spring Security] 06 - 회원가입 로직 (0) | 2024.02.21 |
[Spring Security] 05 - BCrypt 암호화 메서드 (0) | 2024.02.21 |
[Spring Security] 04 - 커스텀 로그인 (0) | 2024.02.21 |