CustomUserDetailsService.java

package com.wilzwert.myjobs.infrastructure.security.service;


import com.wilzwert.myjobs.core.domain.model.user.User;
import com.wilzwert.myjobs.core.domain.model.user.UserId;
import com.wilzwert.myjobs.core.domain.model.user.ports.driven.UserDataManager;
import io.jsonwebtoken.lang.Collections;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
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 java.util.UUID;

/**
 * Custom UserDetailsService used to retrieve user by username extracted from a jwt token subject
 * As of now, the jwt token subject is the user's email
 *
 * @author Wilhelm Zwertvaegher
 */
@Service
@Slf4j
public class CustomUserDetailsService implements UserDetailsService {
    private final UserDataManager userDataManager;

    public CustomUserDetailsService(final UserDataManager userDataManager) {
        this.userDataManager = userDataManager;
    }

    @Override
    public UserDetails loadUserByUsername(String id) throws UsernameNotFoundException, NumberFormatException {
        // we use the id as jwt token subject, therefore we load the user by its id
        User foundUser = userDataManager.findById(new UserId(UUID.fromString(id))).orElseThrow(() -> new UsernameNotFoundException("Cannot load user info"));
        return new UserDetailsImpl(foundUser.getId(), foundUser.getEmail(), foundUser.getUsername(), foundUser.getRole(), foundUser.getPassword(), Collections.of(new SimpleGrantedAuthority(foundUser.getRole())));
    }
}