스프링 시큐리티에서는 다양한 과정을 거쳐 인증을 하게 되는데 이번에 배워 볼 단계는 UserDetailService이다.Provider에서 검증하기전에 먼저 해당 유저의 정보를 가져와야 하는데 이 때 사용하는 것이 UserDetailService이다. 개념은 기본적인 service와 비슷하다.
@Repository
public interface UserRepository extends JpaRepository<MyUser, Long> {
// username으로 User를 찾아 반환하는 메소드
Optional<MyUser> findByUsername(String username);
}
spring data jpa를 이용해 repository를 생성하였다.
@Service
public class UserService implements UserDetailsService {
@Autowired
private UserRepository userRepository;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
MyUser user = userRepository.findByUsername(username)
.orElseThrow(() -> new UsernameNotFoundException("User not found with username: " + username));
List<GrantedAuthority> authorities = user.getRoles().stream()
.map(role -> new SimpleGrantedAuthority("ROLE_" + role.getName()))
.collect(Collectors.toList());
return new User(
user.getUsername(),
user.getPassword(),
authorities
);
}
}
이후
UserDetailService를 implements하여 구현하였는데loadUserByUsername메소드를 통해User객체를 반환하여야 한다. 이 때User는UserDetails를 extends한 security 객체이다.loadUserByUsername메소드에서는 repository를 통해 user를 가져오는데 이 때 user가 없으면exception을 throw하고 만약 존재한다면 name, password, authority를 담아서 provider로 보내주면 된다.