인증

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;
    }
}