問題
- RESTサービス を開発し、動作するようにしました。 しかし、エンドポイントセキュリティは必要です。 現時点では、クレデンシャルなしで利用可能です。
- REST Web サービスに認証情報なしでアクセスできるようにすることはできません。
サービスのエンドポイントを呼び出すために、ユーザーに認証情報(Basic AuthでOK)を送信するように強制するには?
環境
- Liferay DXP 7.0
解決策
https://github.com/liferay/liferay-blade-samples/tree/7.0/liferay-workspace/apps/rest サンプルプロジェクトを使用して、簡単な User-permission layer を実装する方法を紹介します。
- ビルドしてデプロイするとき (
liferay-blade-samples/liferay-workspace/apps/rest{7.0}$ ./../../../gradlew deploy
) このモジュールにアクセスし、 http://localhost:8080/o/com.liferay.blade.rest/users/list : ユーザーのリストが返ってきます。
Test Test
- UsersRestService.javaの関連メソッドを次のように更新してみましょう。
@GET @Path("/list") @Produces("text/plain") public String getUsers() { PermissionChecker permissionChecker = PermissionThreadLocal.getPermissionChecker(); if (!permissionChecker.isCompanyAdmin()) { throw new WebApplicationException(Response.Status.FORBIDDEN); } StringBuilder result = new StringBuilder(); for (User user : _userLocalService.getUsers(-1, -1)) { result.append(user.getFullName()); result.append("\n"); } return result.toString(); }
ご覧の通り、PermissionCheckerを取得し、指定されたユーザがCompany Adminであるかどうかをチェックしています。 そうでない場合は、JAX-RS アプリケーションから許可されている標準的な例外を投げる。 (例外処理の詳細については、ググってみてください)。
- モジュールを再展開し、再テストを行う。 http://localhost:8080/o/com.liferay.blade.rest/users/list に再度アクセスすると、空のレスポンスとHTTP 403ステータスが返されます。
-
Basic Authを使って、サービスの呼び出しをテストしてみましょう。
- "test@liferay.com:test" を base64エンコードします。: base64 <<< test@liferay.com:test : 結果: dGVzdEBsaWZlcmF5LmNvbTp0ZXN0Cg==
- エンドポイントを呼び出す。
curl -H "Authorization: Basic dGVzdEBsaWZlcmF5LmNvbTp0ZXN0Cg==" http://localhost:8080/o/com.liferay.blade.rest/users/list
結果:
Test Test
- 非omniadminユーザーで同じことを繰り返してください。予想通り、空の応答が返ってくるでしょう。
-
Basic Auth is enabled for this application here: https://github.com/liferay/liferay-blade-samples/blob/7.0/liferay-workspace/apps/rest/src/main/resources/configuration/com.liferay.portal.remote.cxf.common.configuration.CXFEndpointPublisherConfiguration-cxf.properties#L2
- 同様に、セッションを通じて認証されたユーザーでブラウザからエンドポイントにアクセスできるようにしたい場合は、
A.) です。 システム設定 > Foundation > CXF Endpoints > /com.liferay.blade.rest > に移動し、以下を追加します。auth.verifier.PortalSessionAuthVerifier.urls.includes=*
または
auth.verifier.PortalSessionAuthVerifier.urls.includes=/users/list
を「Authentication Verifier Properties」に追加し、サンプル・サービスに対してBasic AuthとPortal Sessionの両方の認証検証を有効にしておきます。
auth.verifier.BasicAuthHeaderAuthVerifier.urls.includes=/users/list // or simply "*" auth.verifier.PortalSessionAuthVerifier.urls.includes=/users/list // or simply "*"
B.) サンプルモジュール "rest "の設定ファイルに追加する
C.) システム設定 > Foundation > Portal Session Auth Verifier: にアクセスし、"URs Includes "プロパティに"/users/list "を追加してください。
- 同様に、セッションを通じて認証されたユーザーでブラウザからエンドポイントにアクセスできるようにしたい場合は、