読者です 読者をやめる 読者になる 読者になる

Jerseyで@RolesAllowedアノテーションを使った認可の設定

JAX-RSでは、権限のあるユーザのみリソースにアクセスすることを可能にするために、アノテーションによる宣言型の記述とプログラマティックな処理をのためのAPIがあります。アノテーションを使う場合には、特定のロールを持つユーザのみ許可するのであれば、以下のように@RolesAllowedアノテーションでロールを記述します。

@Path("/myResource")
@RolesAllowed("admin")
public class MyResource {
	@GET
	@Path("{id}")
	@Produces(//...)
	public String get(@PathParam("id") int id){
		// ...
	} 
}

実際のロールの確認は、HttpServletRequest#isUserInRole()が呼び出されるので、認証やロールの設定はコンテナで行なっておく必要があります。
今回この設定を試すにあたって引っかかった点としては、コンテナがJavaEE6対応でない場合には(Tomcatなど)、web.xmlに設定を追加しないとアノテーションが処理されません。以下のようにServletのinit-paramにてRolesAllowedResourceFilterFactoryを追加します。

<servlet>
	<servlet-name>Jersey REST Service</servlet-name>
	<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
	<init-param>
		<param-name>javax.ws.rs.Application</param-name>
		<param-value>com.azuki3.sample.jaxrs.config.MyApplication</param-value>
	</init-param>
	<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>
	<load-on-startup>1</load-on-startup>
</servlet>

参考

RolesAllowedResourceFilterFactory (jersey-bundle 1.11 API)

JavaによるRESTfulシステム構築

JavaによるRESTfulシステム構築