2017-06-13 4 views
1

RESTEasyとJacksonでは、ユーザの役割に応じて特定のプロパティが出力で直列化されないように、モデルで@RolesAllowedアノテーションを使用することは可能ですか?@RolesAllowedを使用してRESTEasyとJacksonでエンティティプロパティをフィルタリングする

私は既にジャージーでこれを行う方法については数多くの文書を見つけましたが、RESTEasyでは何も見つかりませんでした。

私はこのアーキテクチャでブロックされているので、ライブラリーの切り替えはオプションではなく、ObjectMapperという説明を使用すると、hereはオプションではありません。モデルが大きすぎるため、正しいシリアル化のための大きなデータセットのプロパティ。さらに、これはJacksonライブラリの古いバージョンを指しています。新しいバージョンで動作させる方法についてはわかりません。

EDIT

具体的に私が達成しようとしているかを理解するためにthis blog postを参照してください。これはジャージー特有のものであり、これまでにRESTEasyに関する文書は見つかりませんでした。

+0

最新のバージョンのジャクソンとRESTEasyを使用する必要があります。あなたは言った:_モデルは、大規模なデータセットのすべての単一のプロパティに正しいシリアル化をマークするのに時間がかかりすぎるほど大きいです_そうですか、プロパティをフィルタリングするためにどの基準を適用しますか? –

+0

この解決策は、長い間廃止され廃止されたメソッド 'ObjectMapper :: getSerializationConfig :: setSerializationView'を参照しています。私は同じように見えたが、結果がなかった 'withView'メソッドを試してみました。質問で言われているように、ユーザーはそのフィールドにアクセスするための特定のアクセス許可を持っていなければなりません。例えば。 ADMIN権限を持つユーザーはアクセスできます。それ以外の場合はアクセスできません。 IMHOを使用すると、コードを読みやすくしてユースケースを区別しやすくなります。 – Luca

+0

ロール固有のシリアル化を実行することを理解しています。私が尋ねるのは、ビューを使用したくない場合(各Beanの各プロパティに注釈を付ける)、どの基準を使用して直列化されるプロパティを選択するのですか?一つの選択肢は、名前でプロパティをフィルタリングすることです(例えば、 'SimpleBeanPropertyFilter'を使います)。次に、 'ContextResolver'では、ビューを設定する代わりにフィルターを設定します。 –

答えて

2

@JsonViewを使用しない場合は、@JsonFilterと考えることができます。 SimpleBeanPropertyFilterを拡張し、ユーザーの役割に応じて直列化を制御することができ最初の必要性:

public class RoleBasedPropertyFilter extends SimpleBeanPropertyFilter { 

    private String allowedRole; 

    public RoleBasedPropertyFilter(String allowedRole) { 
     this.allowedRole = allowedRole; 
    } 

    @Override 
    public void serializeAsField(Object pojo, JsonGenerator jgen, 
           SerializerProvider provider, 
           PropertyWriter writer) throws Exception { 

     PermitAll permitAll = writer.getAnnotation(PermitAll.class); 
     if (permitAll != null) { 
      serializeAsField(pojo, jgen, provider, writer); 
      return; 
     } 

     DenyAll denyAll = writer.getAnnotation(DenyAll.class); 
     if (denyAll != null) { 
      writer.serializeAsOmittedField(pojo, jgen, provider); 
      return; 
     } 

     RolesAllowed rolesAllowed = writer.getAnnotation(RolesAllowed.class); 
     if (rolesAllowed != null) { 
      if (!Arrays.asList(rolesAllowed.value()).contains(allowedRole)) { 
       writer.serializeAsOmittedField(pojo, jgen, provider); 
       return; 
      } 
     } 

     // If no annotation is provided, the property will be serialized 
     serializeAsField(pojo, jgen, provider, writer); 
    } 
} 

@JsonFilter("roleBasedPropertyFilter")でそれに注釈を付け、特定のBeanにフィルタを適用するには:

@JsonFilter("roleBasedPropertyFilter") 
public class User { 

    private String firstName; 
    private String lastName; 
    private String email; 
    private String password; 

    public String getFirstName() { 
     return firstName; 
    } 

    public String getLastName() { 
     return lastName; 
    } 

    @RolesAllowed({"ADMIN"}) 
    public String getEmail() { 
     return email; 
    } 

    @DenyAll 
    public String getPassword() { 
     return password; 
    } 

    // Other getters and setters 
} 

その後、あなたにあなたのフィルタを登録しますObjectMapperためContextResolver

String currentUserRole = // Get role from the current user 

FilterProvider filterProvider = new SimpleFilterProvider() 
     .addFilter("roleBasedPropertyFilter", 
       new RoleBasedPropertyFilter(currentUserRole)); 

ObjectMapper mapper = new ObjectMapper(); 
mapper.setFilterProvider(filterProvider); 

あなたのフィルタが「グローバル」にしたい、つまり、すべてのBeanに適用する場合、あなたはミックスインクラスを作成し、@JsonFilter("roleBasedPropertyFilter")でそれに注釈を付けることができます。

@JsonFilter("roleBasedPropertyFilter") 
public class RoleBasedPropertyFilterMixIn { 

} 

そして、ミックスインクラスをバインドします〜Object

mapper.addMixIn(Object.class, RoleBasedPropertyFilterMixIn.class); 
関連する問題