2017-12-04 16 views
0

Spring 데이터 나머지를 사용할 때 특정 사용자가 PUT 요청을 사용하여 엔티티의 일부만 편집 할 수있게하는 방법이 있습니까?Spring 데이터 나머지로 PUT을 사용하여 특정 사용자가 객체의 모든 속성을 편집하는 것을 제한하는 방법은 무엇입니까?

예를 들어이 항목을 촬영 :

이 항목의 작성자 만 "설명"필드를 편집 할 수있는 다른 사용자를 제한하면서 PUT 요청을 사용하여 전체 항목을 편집 할 수있는 가장 좋은 방법은 무엇입니까
{ 
    "name": "Item1", 
    "description": "Description", 
    "creator": "User1" 
} 

?

행운을 빌어하지 않고 사용자 정의 유효성 검사기와 이벤트 처리기를 사용해 보았습니다.

+0

REST 저장소 이벤트를 시도 했습니까? @HandleBeforeSave 이벤트와 마찬가지로? –

+0

예, 문제는 핸들러에 전달 된 항목이 PUT 요청을 통해 전달 된 항목으로 변경된 것입니다. – Florian

+0

그리고 데이터베이스 계층의 변경을 처리 할 수 ​​있습니까 (예 : mysql setting updateable = false를 사용하는 경우)? –

답변

1

고객님의 경우에 맞춤 Validator이 적합하다고 생각합니다.

먼저 - 그것의 이전 상태를 저장하기 위해 당신의 실체를 업데이트 (@AlanHay 덕분에) :

@Entity 
class ItemEntity { 

    @Transient 
    private ItemEntity previousState; 

    @PostLoad 
    private void setPreviousState(){ 
     previousState = new ItemEntity(); 
     //copy the fields 
    } 

    public ItemEntity getPreviousState(){ 
     return previousState; 
    } 
} 

그런 다음 어떤 '권위'와 현재 사용자가 필드를 변경 한 경우 확인하는 검증을 구현 :

public class ItemValidator implements Validator { 

    @Override 
    public boolean supports(Class<?> clazz) { 
     //... 
    } 

    @Override 
    public void validate(Object target, Errors errors) { 

     Collection<? extends GrantedAuthority> authorities = SecurityContextHolder.getContext().getAuthentication().getAuthorities(); 
     SimpleGrantedAuthority userRole = new SimpleGrantedAuthority("ROLE_USER"); 

     if (authorities.contains(userRole)) { 

      ItemEntity item = (ItemEntity) target; 
      prevItem = item.getPreviousState(); 

      String prevName = prevItem.getName(); 
      String prevCreator = prevItem.getCreator(); 
      String newName = item.getName(); 
      String newCreator = item.getCreator(); 

      if (!prevName.equals(newName)) { 
       errors.rejectValue("name", "You cannot change Name field!"); 
      } 

      if (!prevCreator.equals(newCreator)) { 
       errors.rejectValue("creator", "You cannot change Creator field!"); 
      } 
     } 
     // Other checks... 
    } 
} 

그런 RepositoryRestConfigurerAdapter 플러그인이 검사기 :

@Configuration 
public class RepoRestConfig extends RepositoryRestConfigurerAdapter { 

    @Override 
    public void configureValidatingRepositoryEventListener(ValidatingRepositoryEventListener v) { 
     v.addValidator("beforeCreate", itemValidator()); // POST (if needed) 
     v.addValidator("beforeSave", itemValidator()); // PUT/PATCH 
     super.configureValidatingRepositoryEventListener(v); 
    } 

    @Bean 
    ListingValidator itemValidator() { 
     return new ItemValidator(); 
    } 
} 

나는 이것이 작동해야한다고 생각합니다 ...