개발/JAVA

java - UserDetails 과 UserDetailsService 로그인 기능 기초지식

외노자개발 2022. 11. 2. 16:44
반응형
// 시큐리티가 /login 주소요청이 오면 낚아채서 로그인을 진행
// 로그인을 진행이 완료가 되면 시큐리티 session을 만들어 준다. (Security ContextHolder)
// 오브젝트 타입 => Authentication 타입 객체
// Authentication 안에 User정보가 있어야한다. 
// User 오브젝트 타입 => UserDetails 타입 객체

// Security Session => Authentication 객체를 넣어야 하고 => UserDetails 타입 이여야한다. 

public class PrincipalDetails implements UserDetails {
	
	private User user;
	
	public PrincipalDetails(User user) {
		this.user = user;
	}

	// 해당 User의 권한을 리턴하는 곳
	@Override
	public Collection<? extends GrantedAuthority> getAuthorities() {
		Collection<GrantedAuthority> collect = new ArrayList<>();
		collect.add(new GrantedAuthority() {
			@Override
			public String getAuthority() {
				return user.getRole();
			}
		});
		return collect;
	}
    ...
}

 

UserDetails 구현


먼저 인증 처리에 필요한 자격 증명(사용자 이름과 암호)과 사용자 정보를 제공하기 위한 인터페이스의 UserDetails 구현 클래스를 만들어야 합니다.

여기서는 PrincipalDetails 에서 implements 로 UserDetails를 받고 있다.

 

 

user.getRole();을 해서 값을 반환 받아 로그인을 하고 있다. 

Collection 형인 GrantedAuthority는 String으로 반환을 해주기 위해서 collet를 만들었다.

collet.add를 해서 GrantedAuthority를 new해서 넣어준다.그러면 String을 리턴해줄 수 있다.

 

 

 

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

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

pw와 username의 설정은 리턴 값이 String이기에 그대로 반환이 가능하다!!

 

java.util.Collection<? extends GrantedAuthority>란?

사용자에게 부여된 권한을 반환합니다.

 

 

UserDetailsService 구현


UserDetailsService는 자격 증명과 사용자의 상태를 데이터 저장소에서 검색하는 인터페이스입니다.

 

// 시큐리티 설정에서 loginProcessingUrl("/login");
// /login 요청이 오면 자동으로 UserDetailsService ㅌ입으로 IoC되어 있는 load UserByUsername을 호출 
@Service
public class PrincipalDetailsService implements UserDetailsService {

	@Autowired
	private UserRepository userRepository;
	
	// securitySession(Authentication(userdetails) )
	@Override
	public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
		User userEntity = userRepository.findByUsername(username);
		if(userEntity != null) {
			return new PrincipalDetails(userEntity);
		}
		return null;
	}

로그인에서 규칙이 있다. 

/login 요청이 오면 자동으로 UserDetailsService의 IoC되어 있는 Load UserByUsername을 호출해준다.

  그렇기에 그 기능을 작성해준다.

 

findByUsername()은 JPA에서 들고 있지 않기 때문에 Repository에서 정의를 해준다.

유저의 이름을 검색해서 userEntity에 넣어준다. 

userEntity에 값이 있다면 PrincipalDetails를 호출한다. 

반응형