Spring Boot Security 로그인
🌿 Security 로그인
시큐리티로 로그인 기능을 하기 위해서는 필요한 bean을 추가해주는 config 클래스 파일을 추가하여 기본적인 세팅을 해야한다. 👇🏻
1. 회원 도메인 생성
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity
public class CustBas implements UserDetails {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@NotNull
@Column(unique = true)
private String custId; // 고객아이디
@NotNull
private String custNm; // 고객명
private String custPassword; // 고객패스워드
@NotNull
@Column(unique = true)
private String custIdfyNo; // 고객식별번호(주민번호)
private String custBirth; // 생년월일(yyyy.mm.dd)
@NotNull
private String custNo; // 고객번호(전화번호)
private String custSex; // 고객성별
private String custAddress; // 고객주소
@NotNull
@Column(unique = true)
private String custEmail; // 고객이메일
private String intmPurStusYn; // 기기구매여부
// DTO <-> Entity
@Builder
public CustBas( String custId, String custNm, String custPassword, String custIdfyNo, String custNo, String custEmail, String custBirth, String custAddress, String custSex, String intmPurStusYn) {
this.custId = custId;
this.custNm = custNm;
this.custPassword = custPassword;
this.custIdfyNo = custIdfyNo;
this.custNo = custNo;
this.custEmail = custEmail;
this.custBirth = custBirth;
this.custAddress = custAddress;
this.custSex = custSex;
this.intmPurStusYn = intmPurStusYn;
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
Collection<GrantedAuthority> collection = new ArrayList<>();
// 모든 회원은 user 권한을 가짐
collection.add(new SimpleGrantedAuthority("ROLE_USER"));
// Id가 admin인 회원은 admin권한도 가짐
if (isAdmin()) {
collection.add(new SimpleGrantedAuthority("ROLE_ADMIN"));
}
return collection;
}
// 관리자 권한
public boolean isAdmin() {
return "admin".equals(custId);
}
// 사용자 id 반환
@Override
public String getUsername() {
return getCustId();
}
// 사용자 비밀번호 반환
@Override
public String getPassword() {
return getCustPassword();
}
// 계정 만료 여부, true: 만료X
@Override
public boolean isAccountNonExpired() {
return true;
}
// 계정 잠금 여부, true: 잠금X
@Override
public boolean isAccountNonLocked() {
return true;
}
// 패스워드 만료 여부, true: 만료X
@Override
public boolean isCredentialsNonExpired() {
return true;
}
// 계정 사용 가능 여부, true: 사용가능
@Override
public boolean isEnabled() {
return true;
}
}
Spring Security에서 사용자 정보를 처리하기 위한 인터페이스인 UserDetails를 구현하여 해당 클래스(CustBas)는 Spring Security와의 통합을 지원하며, 사용자 계정과 관련된 정보를 제공.
- getAuthorities(): 사용자가 가진 권한들을 반환
- getUsername(): 사용자의 이름(일반적으로는 ID)을 반환
- getPassword(): 사용자의 암호화된 비밀번호를 반환
- isAccountNonExpired(): 계정이 만료되었는지 여부를 나타내는 boolean 값을 반환
- isAccountNonLocked(): 계정이 잠겨 있는지 여부를 나타내는 boolean 값을 반환
- isCredentialsNonExpired(): 사용자의 자격 증명(비밀번호 등)이 만료되었는지 여부를 나타내는 boolean 값을 반환
- isEnabled(): 계정이 활성화되었는지 여부를 나타내는 boolean 값을 반환
2. Repository 생성
public interface CustRepository extends JpaRepository<CustBas, Long> {
Optional<CustBas> findByCustId(String custId);
}
3. Service 생성
@Service
@RequiredArgsConstructor
@Transactional(readOnly = true)
public class CustomUserDetailsService implements UserDetailsService {
@Autowired
CustRepository custRepository;
@Override
public UserDetails loadUserByUsername(String custId) throws UsernameNotFoundException {
CustBas userData = custRepository.findByCustId(custId)
.orElseThrow(() -> new UsernameNotFoundException("custId(%s) not found".formatted(custId)));
return new User(userData.getCustId(), userData.getPassword(), userData.getAuthorities());
}
}
- custId에 해당하는 사용자를 검색
- 사용자가 존재하지 않는 경우 예외 처리: orElseThrow 메서드를 사용하여 데이터가 없을 경우 UsernameNotFoundException을 발생
- UserDetails 객체 반환: 사용자 데이터가 존재하는 경우, 이 정보를 기반으로 User 객체를 생성하여 반환
Leave a comment