권한은 User(일반 사용자) , Admin(관리자 사용자) 총 두개로 나눠
로그인하여 인증 된 일반 사용자에게 물건을 구매할 수 있도록 권한을 주었고
관리자는 사이트 페이지, 카테고리, 상품 수정 권한을 주었습니다.
1. User 유저
User 클래스에 UserDetails(사용자 정보를 담은 인터페이스)를 implements (상속) 하고
어노테이션 추가한 것들
@Entity
@Table(name="users")
@Data
상속 extends, implements 차이
extends : 부모의 메소드,변수 그대로 사용가능
implements : 부모 메소드를 꼭 재정의 오버라이드 해야함
- UserDetails 상속받는데 add unimplemented methods 자동생성하기
자동생성 추가 후 자동완성 된 코드
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
// TODO Auto-generated method stub
return null;
}
패스워드와 유저네임은 삭제하기
@DATA 로 get,set 메서드를 자동으로 만들어주기 때문에 필요없음
@Override
public String getPassword() {
// TODO Auto-generated method stub
return null;
}
@Override
public String getUsername() {
// TODO Auto-generated method stub
return null;
}
@Override
public boolean isAccountNonExpired() {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean isAccountNonLocked() {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean isCredentialsNonExpired() {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean isEnabled() {
// TODO Auto-generated method stub
return false;
}
- User 클래스에 warning뜨는데 serial version ID 추가하기
추가하니 자동완성 된 코드.
private static final long serialVersionUID = 1L;
유저와 어드민의 serialVersionUID 차이
user 의 serialVersionUID = 1L
admin 의 serialVersionUID = 2L
@Entity
@Table(name = "users") //DB의 users테이블과 이름같도록
@Data
public class User implements UserDetails{
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String username;
private String password;
private String email;
@Column(name = "phone_number")
private String phoneNumber;
DB에서 Id 자동생성 하는 어노테이션
@Id와 @GeneratedValue를 같이 사용한다.
@id
@GeneratedValue(strategy = GenerationType.IDENTITY)
☆ 유저 권한만 주기 ☆
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
//권한 목록을 리턴(유저 권한)
return Arrays.asList(new SimpleGrantedAuthority("ROLE_USER"));
}
@Override
public boolean isAccountNonExpired() {
// 계정이 만료 되지 않았나요?
return true; //만료안됨
}
@Override
public boolean isAccountNonLocked() {
// 계정이 잠겨있지 않나요?
return true; //잠기지 않음
}
@Override
public boolean isCredentialsNonExpired() {
// 비밀번호가 만료되지 않았나요?
return true; //만료안됨
}
@Override
public boolean isEnabled() {
// 사용 가능한 계정인가요?
return true; //사용가능
}
validation 적용하기
@NotBlank @Size(min = 2, message = "유저네임을 2자 이상")
private String username;
@NotBlank @Size(min = 4, message = "패스워드는 4자 이상")
private String password;
//DB에는 없고 패스워드 확인용
@Transient
private String confirmPassword;
@Email(message = "이메일 양식에 맞게 입력")
private String email;
@Column(name = "phone_number")
@Size(min = 6, message = "전화번호 6 이상")
private String phoneNumber;
@Email 이메일 양식이 맞는지 유효성 검사
@Transient : 실제 DB에는 없지만 패스워드 확인용이라서 패스워드와 같다.
2. Admin 관리자
@Entity
@Table(name = "admin")
@Data
public class Admin implements UserDetails{
private static final long serialVersionUID =2L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) //DB에서 id자동생성
private int id;
private String username;
private String password;
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
//권한 목록을 리턴(관리자 권한)
return Arrays.asList(new SimpleGrantedAuthority("ROLE_ADMIN"));
}
@Override
public boolean isAccountNonExpired() {
// 계정이 만료 되지 않았나요?
return true; //만료안됨
}
@Override
public boolean isAccountNonLocked() {
// 계정이 잠겨있지 않나요?
return true; //잠기지 않음
}
@Override
public boolean isCredentialsNonExpired() {
// 비밀번호가 만료되지 않았나요?
return true; //만료안됨
}
@Override
public boolean isEnabled() {
// 사용 가능한 계정인가요?
return true; //사용가능
}
관리자는 1~2명이니까 유효성검사 따로 필요하지 않을 것 같아서 안씀.
'Spring boot | 쇼핑몰 만들기 | 어글리 마켓 > security | 로그인' 카테고리의 다른 글
Spring Boot | AJAX에 csrf 적용방법 (0) | 2022.05.13 |
---|---|
Login 로그인 페이지 (0) | 2022.05.13 |
인증(유저,관리자) 하는 클래스 UserDetailsServiceImpl (0) | 2022.05.12 |
가입하는 컨트롤러 RegistrationController (0) | 2022.05.12 |
스프링 시큐리티 적용하기 | 유저,관리자 테이블 생성 (0) | 2022.05.12 |