다음과 같은 과정으로 진행한다.
package com.chan.ssb.user;
import jakarta.persistence.*;
@Entity
public class SiteUser {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
@Column(unique = true)
private String username;
private String password;
private String role;
}
package com.chan.ssb.user;
public class SiteUserDTO {
private long id;
private String username;
private String password;
private String role;
}
package com.chan.ssb.user;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.Optional;
public interface UserRepository extends JpaRepository<SiteUser, Long> {
Optional<SiteUser> findByusername(String username);
}
package com.chan.ssb.user;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
@Service
public class UserService {
private final UserRepository userRepository;
private final PasswordEncoder passwordEncoder;
public UserService(UserRepository userRepository, PasswordEncoder passwordEncoder) {
this.userRepository = userRepository;
this.passwordEncoder = passwordEncoder;
}
public SiteUserDTO createSiteUser(SiteUserDTO siteUserDTO) {
SiteUser siteUser = new SiteUser(siteUserDTO.getId(), siteUserDTO.getUsername(), passwordEncoder.encode(siteUserDTO.getPassword()), siteUserDTO.getRole());
SiteUser savedUser;
try {
savedUser = userRepository.save(siteUser);
} catch (DataIntegrityViolationException e) {
throw new IllegalArgumentException("Username already exists");
} catch (Exception e) {
throw new IllegalArgumentException("An error occurred while saving the user");
}
return SiteUserDTO.fromEntity(savedUser);
}
}
package com.chan.ssb.user;
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.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
@Service
public class UserSecurityService implements UserDetailsService {
private final UserRepository userRepository;
public UserSecurityService(UserRepository userRepository){
this.userRepository = userRepository;
}
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
Optional<SiteUser> _siteUser = this.userRepository.findByusername(username);
if (_siteUser.isEmpty()) {
throw new UsernameNotFoundException("User not found");
}
SiteUser siteUser = _siteUser.get();
List<GrantedAuthority> authorities = new ArrayList<>();
authorities.add(new SimpleGrantedAuthority(siteUser.getRole()));
return new User(siteUser.getUsername(), siteUser.getPassword(), authorities);
}
}