package co.jp.app.service; import java.util.Collection; import java.util.Collections; import co.jp.app.dto.RegistrationDto; import co.jp.app.entity.UserEntity; import co.jp.app.repository.UserRepository; import org.jetbrains.annotations.NotNull; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service public class UserService implements UserDetailsService { private final UserRepository userRepository; private final PasswordEncoder passwordEncoder; public UserService(UserRepository userRepository, PasswordEncoder passwordEncoder) { this.userRepository = userRepository; this.passwordEncoder = passwordEncoder; } @Transactional public UserEntity registerNewUser(@NotNull RegistrationDto registrationDto) throws Exception { if (userRepository.existsByEmail(registrationDto.getEmail())) { throw new Exception("error: Email" + registrationDto.getEmail() + " had been used"); } UserEntity newUser = new UserEntity(); newUser.setName(registrationDto.getName()); newUser.setEmail(registrationDto.getEmail()); newUser.setPassword(passwordEncoder.encode(registrationDto.getPassword())); return userRepository.save(newUser); } @Override @Transactional(readOnly = true) public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException { UserEntity userEntity = userRepository.findByEmail(email) .orElseThrow(() -> new UsernameNotFoundException(email + " not found")); Collection authorities = Collections.singletonList(new SimpleGrantedAuthority("ROLE_USER")); return new User( userEntity.getEmail(), userEntity.getPassword(), true, // enabled true, // accountNonExpired true, // credentialsNonExpired true, // accountNonLocked authorities // role ); } }