보통의 Entity(JPA에서의..)는 등록사용자ID, 등록일자를 가지게 된다.
package kr.co.xfilegolf.sale;
import kr.co.xfilegolf.SecurityUtils;
import lombok.Data;
import javax.persistence.*;
import java.time.LocalDate;
import java.time.LocalDateTime;
/**
* @author jason, Moon
* @since 2016-10-09
*/
@Entity
@Table(name = "SALE")
@Data
public class Sale {
@Id
@GeneratedValue
@Column(name = "ID")
private Long id;
@Column(name = "PRODUCT_CODE")
private String productCode;
@Column(name = "SERIAL_NUMBER")
private String serialNumber;
@Column(name = "SALES_ON")
private LocalDate salesOn;
@Column(name = "CREATED_BY")
private String createdBy;
@Column(name = "CREATED_ON")
private LocalDateTime createdOn;
@Column(name = "LAST_MODIFIED_BY")
private String lastModifiedBy;
@Column(name = "LAST_MODIFIED_ON")
private LocalDateTime lastModifiedOn;
@PostPersist
public void postPersist() {
this.createdOn = LocalDateTime.now();
this.createdBy = SecurityUtils.currentUserName();
}
}
이때, 데이터가 저장될때 현재 세션의 사용자ID를 가져와서 해당 컬럼에 넣어주는 작업을 해야한다.
Spring Security에서는 SecurityContextHolder를 제공해 현재 세션의 사용자 정보를 가져올 수 있다.
먼저, 현재 세션 사용자의 객체를 가져오는 것은 아래와 같다.
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
User user = (User) authentication.getPrincipal();
Authentication 객체의 getPrincipal() 메서드를 실행하게 되면, UserDetails를 구현한 사용자 객체를 Return 한다.
UserDetails를 구현한 객체가 가지고 있는 정보들을 가져올 수 있다.
필자는 curruntuserName() 메서드를 만들어서 현재 사용자의 ID를 Return 하게 했다.
public static String currentUserName() {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
User user = (User) authentication.getPrincipal();
return user.getUsername();
}
두번째로, 현재 사용자의 Authorities를 가져오는 메서드는 Authentication 객체의 getAuthentication() 메서드이다.
현재 사용자가 "ROLE_ADMIN"이라는 ROLE을 가지고 있는지 확인하는 메서드는 아래와 같이 만들었다.
public static boolean hasAdminRole() {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();
return authorities.stream().filter(o -> o.getAuthority().equals("ROLE_ADMIN")).findAny().isPresent();
}
getAuthentication() 메서드는 GrantedAuthority 를 상속 받은 권한 객체 Collection을 Return 한다.
stream을 사용해서, "ROLE_AMDIN"을 Filtering 하고, 해당 결과가 있는지를 반환한다.
'Java > Spring' 카테고리의 다른 글
Spring Security 로그인 성공 혹은 실패 후 부가 작업 하기. (0) | 2018.03.21 |
---|---|
Thymeleaf에서 날짜 관련 Utility 사용하기. (0) | 2016.12.17 |
Spring Boot 에 JOOQ 설정하기. (1) | 2016.09.11 |
마이바티스(MyBatis) 동적 쿼리 Java로 만들기. (0) | 2016.09.07 |
마이바티스(MyBatis) Mapper XML 파일 빌드에 추가하기. (1) | 2016.09.04 |