2.15. Jakarta RESTful Web Services Web サービスのセキュア化
RESTEasy は、Jakarta RESTful Web Services メソッドの @RolesAllowed、@PermitAll、および @DenyAll アノテーションをサポートします。ただし、これらのアノテーションを認識させるには、ロールベースのセキュリティーを有効にする必要があります。
2.15.1. ロールベースのセキュリティーの有効化 リンクのコピーリンクがクリップボードにコピーされました!
以下の手順に従って、web.xml ファイルを設定し、ロールベースのセキュリティーを有効にします。
アプリケーションが Jakarta Enterprise Beans を使用する場合は、ロールベースのセキュリティーをアクティベートしないでください。Jakarta Enterprise Beans コンテナーは、RESTEasy の代わりにこの機能を提供します。
RESTEasy Jakarta RESTful Web Services Web Service のロールベースセキュリティーの有効化
-
テキストエディターでアプリケーションの
web.xmlファイルを開きます。 以下の
<context-param>をファイルに、<web-app>内に追加します。<context-param> <param-name>resteasy.role.based.security</param-name> <param-value>true</param-value> </context-param><security-role>タグを使用して、RESTEasy Jakarta RESTful Web Services WAR ファイル内で使用するすべてのロールを宣言します。<security-role> <role-name>ROLE_NAME</role-name> </security-role> <security-role> <role-name>ROLE_NAME</role-name> </security-role>すべてのロールに対して、Jakarta RESTful Web Services ランタイムによって処理されるすべての URL へのアクセスを承認します。
<security-constraint> <web-resource-collection> <web-resource-name>Resteasy</web-resource-name> <url-pattern>/PATH</url-pattern> </web-resource-collection> <auth-constraint> <role-name>ROLE_NAME</role-name> <role-name>ROLE_NAME</role-name> </auth-constraint> </security-constraint>このアプリケーションの適切なログイン設定を定義します。
<login-config> <auth-method>BASIC</auth-method> <realm-name>jaxrs</realm-name> </login-config>
ロールベースのセキュリティーは、定義されたロールとともにアプリケーション内で有効にされています。
例: ロールベースのセキュリティー設定
<web-app>
<context-param>
<param-name>resteasy.role.based.security</param-name>
<param-value>true</param-value>
</context-param>
<security-constraint>
<web-resource-collection>
<web-resource-name>Resteasy</web-resource-name>
<url-pattern>/security</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>admin</role-name>
<role-name>user</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>jaxrs</realm-name>
</login-config>
<security-role>
<role-name>admin</role-name>
</security-role>
<security-role>
<role-name>user</role-name>
</security-role>
</web-app>
2.15.2. アノテーションを使用した Jakarta RESTful Web Services Web Services のセキュア化 リンクのコピーリンクがクリップボードにコピーされました!
アノテーションを使用して Jakarta RESTful Web Services Web サービスのセキュリティーを保護するには、以下の手順を実行します。
- ロールベースセキュリティーを有効化します。
セキュリティーアノテーションを Jakarta RESTful Web Services Web サービスに追加します。RESTEasy は以下のアノテーションをサポートします。
@RolesAllowed-
メソッドにアクセスできるロールを定義します。すべてのロールは
web.xml ファイルで定義する必要があります。 @PermitAll-
web.xmlファイルに定義されているすべてのロールがメソッドにアクセスできるようにします。 @DenyAll- メソッドへのすべてのアクセスを拒否します。
以下の例は、@RolesAllowed アノテーションを使用して admin ロールが Web サービスにアクセスできることを指定します。
@RolesAllowed("admin")
@Path("/test")
public class TestService {
...
}
2.15.3. プログラムによるセキュリティーの設定 リンクのコピーリンクがクリップボードにコピーされました!
Jakarta RESTful Web Services には、セキュアな要求に関するセキュリティー情報を収集するためのプログラムによる API が含まれています。javax.ws.rs.core.SecurityContext インターフェイスには、セキュアな HTTP 呼び出しを行うユーザーのアイデンティティーを判断するメソッドがあります。また、現在のユーザーが特定のロールに属するかどうかをチェックすることができるメソッドもあります。
public interface SecurityContext {
public Principal getUserPrincipal();
public boolean isUserInRole(String role);
public boolean isSecure();
public String getAuthenticationScheme();
}
SecurityContext インスタンスにアクセスするには、@Context アノテーションを使用して、フィールド、セッターメソッド、またはリソースメソッドパラメーターにインジェクトします。
@Path("test")
public class SecurityContextResource {
@Context
SecurityContext securityContext;
@GET
@Produces("text/plain")
public String get() {
if (!securityContext.isUserInRole("admin")) {
throw new WebApplicationException(Response.serverError().status(HttpResponseCodes.SC_UNAUTHORIZED)
.entity("User " + securityContext.getUserPrincipal().getName() + " is not authorized").build());
}
return "Good user " + securityContext.getUserPrincipal().getName();
}
}