

### 前提・実現したいこと

JavaEE6 に準拠した環境下のJAX-RSで  
javax.annotation.security.RolesAllowedアノテーションを  
使い認可機能を実現したいですが方法がわかりません。

私は、`@RolesAllowed`を以下のようなイメージで使えたらいいなぁと思ってます。

  1. `ServletFileter`または、`@PostConstruct`を付与したメソッド内部で、  
アクセスしたユーザをキーにDBからユーザに紐つくロールを取得。

  2. 1で取得したロールを`@RolesAllowed`で認識できるように設定。(これの方法がわからないorz)
  3. JAX-RSリソースの認可を`@RolesAllowed`で行う。

書籍やWebで例えば下記のようなコードがあります。

[code]

    @Path("/")
    @PermitAll
    public class Resource {
        @RolesAllowed("user")
        @GET
        public String get() { return "GET"; }
    }
    
[/code]

この`@RolesAllowed("user")`の設定をWeb.xmlに記述する  
ようなこと書いてありますが、いまいちこの使い方がわかっておりません。  
アクセス時に渡されるパラメータやHTTPヘッダにより適用する  
ロールって変わるとおもうのですが、なんでWeb.xmlに書くのか  
理解ができない。


CC BY-SA 3.0
2015-12-19T08:29:55.590
20174
2016-04-23T10:09:40.957
2020-06-17T08:14:45.997
-1
13737
question
java rest java-ee jax-rs servlet
javax.annotation.security.RolesAllowedアノテーションの使い方


> なぜweb.xmlに書くのか

上記の使い方の希望で挙げている１、２についてはコンテナ側が提供する機能になります。  
コンテナはweb.xmlに設定が書かれていないと何をすべきか理解できないため、  
web.xmlに書く必要があります。

では、web.xmlに何を書くのかというと、  
特定のURLに対するアクセスに対して、どのロールを許可するのかということを書きます。  
例えば下記のような設定です。

[code]

    <security-constraint>
        <web-resource-collection>
            <web-resource-name>Web Resource</web-resource-name>
            <url-pattern>/*</url-pattern>
            <http-method>GET</http-method>
        </web-resource-collection>
        <auth-constraint>
            <role-name>Administrator</role-name>
            <role-name>User</role-name>
        </auth-constraint>
    </security-constraint>
    
[/code]

この例では、すべてのGETリクエストのURLはAdministrator,
Userロールにのみ許可するということになります。このように、ロールの適用はパラメータ等で切り替わるのではく、  
URL及びHTTPメソッドによって振り分けられます。

また、この設定だけではDBからロールを取得するという処理は勝手には行ってはくれないので、  
コンテナ側に設定が必要になります。  
ここで説明すると長くなってしまいますので、「GlassFish JdbcRealm」や「WildFly
JdbcRealm」で検索してみてください。それぞれのコンテナに合わせた設定方法を説明したサイトが見つかると思います。

> @RolesAllowedで認識できるように設定

`@RolesAllowed`の認識のさせ方ですが、これはJAX-RSの実装によって異なります。  
JAX-RSの実装の一つであるJerseyの場合は、下記の設定がweb.xml必要になります。

[code]

    <servlet>
        <servlet-name>ServletContainer</servlet-name>
        <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
        <!-- @RolesAllowed を使用するのなら必須 -->
        <init-param>
          <param-name>com.sun.jersey.spi.container.ResourceFilters</param-name>
          <param-value>com.sun.jersey.api.container.filter.RolesAllowedResourceFilterFactory</param-value>
        </init-param>
      </servlet>
    
[/code]

また、もう一つの実装であるRESTEasyでは下記の設定がweb.xmlに必要です。

[code]

    <context-param>
        <param-name>resteasy.role.based.security</param-name>
        <param-value>true</param-value>
    </context-param>
    
[/code]

このようにJavaEEのセキュリティ周りは、自ら実装することなく設定だけで実現させる仕組みになっています。


CC BY-SA 3.0
2015-12-25T07:10:36.940
20355
2015-12-25T07:10:36.940
10724
20174
answer