728x90

작업의 루틴은 다음과 같다.

  1. 시큐리티가 로그인을 진행시키면 UserDetails타입의 객체를 실행한다.
  2. 로그인 진행이 완료되면 시큐리티 session을 생성하고 Security ContextHolder라는 키 값으로 세션 정보 저장한다.
  3. 키에 대한 값으로 들어가는 오브젝트 타입은 Authentication이다.
  4. 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) 형식이 완성되고 시큐리티에 의해 로그인이 완료된다.

 

-

 

* 해당 글은 인프런에 게시된 '최주호'님의 강의를 듣고 개인적으로 정리한 글입니다.

강의 출처 : 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

+ Recent posts