JAX-RSをやってみる (20) - SecurityEntityFiltering -

2014-10-23T00:00:00+00:00 Java JAX-RS

参考: https://jersey.java.net/documentation/latest/entity-filtering.html#ef.security.annotations

Entity Filtering機能を使えば出力されるエンティティのデータ等?をフィルタリングできるらしい。一番わかりやすいパターンとして言えば、ログインしているユーザーが持つ権限に応じて出力されては困るデータ等をフィルタリングすることにより出力させないようにする事が可能になる感じ(他にも@EntityFilteringアノテーションを使ってフィルタリングする事自体も可能)

という事でやってみた

導入

org.glassfish.jersey.ext:jersey-entity-filteringのパッケージを利用するので設定しておく必要あり

Sample.java

package sample;

import javax.annotation.security.DenyAll;
import javax.annotation.security.RolesAllowed;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Sample {

    private int id;

    private String name;

    @DenyAll
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id= id;
    }

    @RolesAllowed("admin")
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

getterメソッドの所にアノテーションがついてるが

  • @DenyAllだといかなる場合においても出力されないように
  • @RolesAllowedだと指定されているロールを持つユーザー以外に対しては出力されないように

というように状況に応じてデータをフィルタリング出来る

SampleApplication.java

package sample;

import org.glassfish.jersey.message.filtering.SecurityEntityFilteringFeature;
import org.glassfish.jersey.server.ResourceConfig;

public class SampleApplication extends ResourceConfig {
    public SampleApplication() {
        packages("sample");
        register(SecurityEntityFilteringFeature.class);
    }
}

registerするだけでいい。RolesAllowedDynamicFeatureもregisterされるのでそれを使う場合においても別途でregisterしておく必要は無いっぽい

まぁこんだけ。あとは適当なリソースクラスを使ってSampleクラスを返すメソッドを定義して@Producesなりでapplication/jsonで出すと

  • adminロールを持つ場合: nameは表示されるがidは@DenyAllにより表示されない
  • adminロールを持たない場合: idもnameも表示されない。nameは@RolesAllowedで指定されているロールに一致しないので表示されない

っていうような機能を盛り込む事が出来る模様。まだ仕組みが微妙なので色々調べて判明次第ネタ書こうかと

chrome.gcm tsharkでgeoip