public class PrincipalDetails implements UserDetails {
private User user; // 컴포지션
public PrincipalDetails(User user){
this.user = user;
}
// 해당 User의 권한을 리턴하는 곳!
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
// user.getRole();
Collection<GrantedAuthority> collect = new ArrayList<>();
collect.add(new GrantedAuthority() {
@Override
public String getAuthority() {
return user.getRole();
}
});
return collect;
}
@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() {
// 우리 사이트!! 1년동안 회원이 로그인을 안하면 !! 휴먼 계정으로 하기로 함.
// user.getLoginDate(); => 들구와서 현재시간 - 로그인시간 => 1년을 초과하면 return false;
return true;
}
}
PricipailDetailsService
UserDetailsService implements 해준다.
loadUserByUsername 를 override 한다.
메모리에 Service라고 띄우기 위해 @Service를 붙여준다.
그럼 왜 PricipalDetails는 메모리에 강제로 띄우지 않는가? (나중에 작성자가 강제로 new 해서 메모리에 띄울 예정이기 때문에 따로 어노테이션을 붙이지 않음.)
// 시큐리티 설정에서 loginProcessingUrl("/login");
// login 요청이 오면 자동으로 UserDetailsService 타입으로 IoC되엉 있는 loadUserByUsername 함수가 실행
// => 규칙이다.
@Service
public class PrincipalDetailsService implements UserDetailsService {
@Autowired
private UserRepository userRepository;
// 시큐리티 session = Authentication = UserDetails
// 시큐리티 session = Authentication(내부 UserDetails)
// 시큐리티 session(내부 Authentication(내부 UserDetails))
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
User userEntity = userRepository.findByUsername(username);
return null;
}
}
UserRepository
public interface UserRepository extends JpaRepository<User, Integer> {
// findBy 규칙 -> Username 문법
// select * form user where username = ?
public User findByUsername(String username);
}
PricipailDetailsService
return new PrincipalDetails(userEntity) 을 리턴을하게되면 user정보를 담고 UserDetails로 최종 return을 하게된다.
@Service
public class PrincipalDetailsService implements UserDetailsService {
@Autowired
private UserRepository userRepository;
// 시큐리티 session = Authentication = UserDetails
// 시큐리티 session = Authentication(내부 UserDetails)
// 시큐리티 session(내부 Authentication(내부 UserDetails))
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
User userEntity = userRepository.findByUsername(username);
if(userEntity!=null){
return new PrincipalDetails(userEntity);
}
return null;
}
}