2017-12-04 3 views
0

Spring Data Restを使用する場合、PUTリクエストを使用してエンティティの一部のみを編集できるようにする方法がありますか?一例として、このアイテムを取るSpringのデータレストでPUTを使用して特定のユーザーがオブジェクトのすべての属性を編集するのを制限する方法はありますか?

{ 
    "name": "Item1", 
    "description": "Description", 
    "creator": "User1" 
} 

のみ「説明」フィールドを編集して、他のユーザーを制限しながら、アイテムの作成者は、PUT要求を用いて全アイテムを編集できるようにする最良の方法は何ですか?

私は、カスタムバリデーターとイベントハンドラーを使用してみました。

+0

RESTリポジトリイベントを試しましたか? @HandleBeforeSaveイベントなどのように? –

+0

はい、問題は、ハンドラに渡されるアイテムが、PUTリクエストを介して渡されたアイテムに変更されていることです。 – Florian

+0

そして、データベース層の変更を処理することは可能ですか(たとえば、mysqlを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(); 
    } 
} 

これはうまくいくはずだと思います...

関連する問題