Wanna be Brilliant Full-Stack Developer

SpringBoot 로그인 2 본문

Back-End/Spring Boot

SpringBoot 로그인 2

Flashpacker 2022. 2. 11. 11:06


 

목표

UserDetailsService를 완성해보려고한다!

어제 우리는 IOC에 있는 UserdetailsService가 아니라 로그인 진행할떄 내가 만든 PrincipalDetailsService 실행되게끔 하는것은 성공했다.

 

package com.cos.photogramstart.config.auth;

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;

import com.cos.photogramstart.domain.user.UserRepository;

import lombok.RequiredArgsConstructor;

@RequiredArgsConstructor
@Service // 어노테이션 붙이는 순간 IOC가 된다. 
public class PrincipalDetailsService implements UserDetailsService {

	private final UserRepository userRepository;
	
	@Override
	public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
		System.out.println("나 실행돼?" + username);
		return null;
	}

}

이제는 안에 구현을 하면되는데!

우리는 여기서 궁금할수 있는점은 username만 있고 패스워드는 없으니까 문제가 생기는것이 아닌가? 

하지만 패스워드는 시큐리티가 알아서 비교해주고 처리해준다!

 

우리가 해야할것은 username의 여부를 체크하는것이다

확인 하기 위해서는 UserRepository가 필요하다 유저DB에 있는지 물어볼수있다. 

 

JPA Query Method 라는것은 또 무엇인가?

package com.cos.photogramstart.domain.user;

import org.springframework.data.jpa.repository.JpaRepository;

// 어노테이션이 없어도  JpaRepository를 상속하면 IoC등록이 자동으로 된다.
public interface UserRepository extends JpaRepository<User, Integer>{
	// JPA query method!
	User findByUsername(String username);
}

User object를 찾아서 리턴해줄것이다!

 

PrincipalDetails가 세션에 저장될떄 userEntity 들고 있으니까 세션에 저장된 user object데이터를 활용할수 있다. 

 

 

package com.cos.photogramstart.config.auth;

import java.util.ArrayList;
import java.util.Collection;

import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;

import com.cos.photogramstart.domain.user.User;

import lombok.Data;

@Data
public class PrincipalDetails implements UserDetails{


	private static final long serialVersionUID = 1L;

	private User user;
	
	public PrincipalDetails(User user) {
		this.user = user;
	}
	
	// 권한: 한개가 아닐 수 있음. (3개 이상의 권한) 
	@Override
	public Collection<? extends GrantedAuthority> getAuthorities() {
		
		Collection<GrantedAuthority> collector = new ArrayList<>();
		collector.add(() ->  {	return user.getRole();});
		return collector;
		
	}

	@Override
	public String getPassword() {
		return user.getPassword();
	}

	@Override
	public String getUsername() {
		return user.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;
	}

}

다시한번 강의를 통해 나중에 이해할 필요가있음!

 

로그인 하였을떄 404가 뜬다는것은 무엇이냐면 /는 인증이 필요한 페이지이다. 

/를 하였는데도 404로 간 이유는 인증이 되었기 때문이다!

어떤것을 입력하여도 인증이 되있는 상태로 로그인이 유지되어지는데

로그아웃/logout을 통해서도 내가 로그인이 되었다는것을 확인할수 있다.