質問: ### 前提・実現したいこと JavaEE6 に準拠した環境下のJAX-RSで javax.annotation.security.RolesAllowedアノテーションを 使い認可機能を実現したいですが方法がわかりません。 私は、`@RolesAllowed`を以下のようなイメージで使えたらいいなぁと思ってます。 1. `ServletFileter`または、`@PostConstruct`を付与したメソッド内部で、 アクセスしたユーザをキーにDBからユーザに紐つくロールを取得。 2. 1で取得したロールを`@RolesAllowed`で認識できるように設定。(これの方法がわからないorz) 3. JAX-RSリソースの認可を`@RolesAllowed`で行う。 書籍やWebで例えば下記のようなコードがあります。 ``` @Path("/") @PermitAll public class Resource { @RolesAllowed("user") @GET public String get() { return "GET"; } } ``` この`@RolesAllowed("user")`の設定をWeb.xmlに記述する ようなこと書いてありますが、いまいちこの使い方がわかっておりません。 アクセス時に渡されるパラメータやHTTPヘッダにより適用する ロールって変わるとおもうのですが、なんでWeb.xmlに書くのか 理解ができない。
回答: > > なぜweb.xmlに書くのか > > > 上記の使い方の希望で挙げている1、2についてはコンテナ側が提供する機能になります。 コンテナはweb.xmlに設定が書かれていないと何をすべきか理解できないため、 web.xmlに書く必要があります。 では、web.xmlに何を書くのかというと、 特定のURLに対するアクセスに対して、どのロールを許可するのかということを書きます。 例えば下記のような設定です。 ``` Web Resource /* GET Administrator User ``` この例では、すべてのGETリクエストのURLはAdministrator, Userロールにのみ許可するということになります。このように、ロールの適用はパラメータ等で切り替わるのではく、 URL及びHTTPメソッドによって振り分けられます。 また、この設定だけではDBからロールを取得するという処理は勝手には行ってはくれないので、 コンテナ側に設定が必要になります。 ここで説明すると長くなってしまいますので、「GlassFish JdbcRealm」や「WildFly JdbcRealm」で検索してみてください。それぞれのコンテナに合わせた設定方法を説明したサイトが見つかると思います。 > > @RolesAllowedで認識できるように設定 > > > `@RolesAllowed`の認識のさせ方ですが、これはJAX-RSの実装によって異なります。 JAX-RSの実装の一つであるJerseyの場合は、下記の設定がweb.xml必要になります。 ``` ServletContainer com.sun.jersey.spi.container.servlet.ServletContainer com.sun.jersey.spi.container.ResourceFilters com.sun.jersey.api.container.filter.RolesAllowedResourceFilterFactory ``` また、もう一つの実装であるRESTEasyでは下記の設定がweb.xmlに必要です。 ``` resteasy.role.based.security true ``` このようにJavaEEのセキュリティ周りは、自ら実装することなく設定だけで実現させる仕組みになっています。