개발/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를 호출한다.
반응형