Liferayのリモートサービスはローカル接続のみを許可するため、デフォルトで保護されています。リモートアクセスを有効にするには、IPアドレスに始まり、ユーザーの認証と検証を経て、セキュリティ層を通る必要があります。 Webサービスを呼び出すユーザーは、リモートサービスの呼び出しが正常に完了するための適切な権限(Liferayの権限システムで定義されたもの)を持っている必要があります。このチュートリアルでは、これらのプロセスについて説明します。
セキュリティの最初の層は、呼び出し元IPフィルタリングと呼ばれます。たとえば、ネットワーク内の別のマシンで実行されるバッチジョブがあると仮定します。このバッチジョブはネットワーク上の共有フォルダをポーリングし、LiferayのWebサービスを使用して、Liferayサイトのドキュメントとメディアのアプリケーションに定期的にドキュメントをアップロードするとします。
IPフィルタを介してバッチジョブを取得するには、バッチジョブが実行されるマシンへのWebサービスアクセスを許可する必要があります。たとえば、バッチジョブがLiferayのSOAP Webサービスを使用してドキュメントをアップロードする場合、バッチジョブを実行するマシンのIPアドレスをaxis.servlet.hosts.allowed
プロパティに追加する必要があります。典型的なエントリは、以下のようになります。
axis.servlet.hosts.allowed=192.168.100.100, 127.0.0.1, [SERVER_IP]
バッチジョブを実行するマシンのIPアドレスがサービスの承認済みホストとしてリストされている場合、マシンはLiferayのWebサービスに接続し、適切なユーザー資格情報を渡し、ドキュメントをアップロードできます。
Webサービスを介してリモートサービスを呼び出すと、認証と認証の検証の2段階のプロセスが実行されます。Liferay Webサービスに対するそれぞれの呼び出しには、ユーザー認証トークンのp_auth
を添付する必要があります。トークンの作成は、Webサービスの呼び出し元次第です(たとえば、Liferayのユーティリティまたはサードパーティソフトウェアを使用して作成できます)。Liferayは、トークンに一致するLiferayユーザーが存在することを確認します。資格情報が無効な場合は、Webサービスの呼び出しが中止されます。それ以外の場合は、プロセスはLiferayのユーザー許可レイヤーに進みます。
ユーザー許可レイヤーは、リモートサービスに対してトリガーされる最後のセキュリティ層です。ローカルまたはリモートのサービスが関係しているかどうかに関係なく、すべてのオブジェクトに使用されます。Webサービスの呼び出しに関連付けられたユーザーIDには、アクセスしようとしているオブジェクトを操作する権限が必要です。ユーザーIDに権限がない場合は、リモートの例外がスローされ、インスタンス管理者はこれらのリソースへのアクセスをユーザーに許可することができます。
たとえば、サイトにDocumentsという名前のドキュメントとメディアのライブラリフォルダを作成し、Document Uploadersというロールを作成して、このロールに新しいフォルダにドキュメントを追加する権限を付与したとします。バッチジョブがLiferayのWebサービスにアクセスして、フォルダにドキュメントをアップロードする場合、このロールを持つユーザーID(または、インスタンス管理者など、このフォルダにドキュメントを追加する個々の権限を持つユーザーのユーザーID)を使用して、Webサービスを呼び出す必要があります。これを行わない場合、LiferayはWebサービスへのアクセスを拒否します。
非ブラウザクライアントからリモートサービスを呼び出す場合、HTTPBasic認証を使用して、ユーザー資格情報を指定することができます。セキュリティ上の理由から、ブラウザからWebサービスを呼び出すには、ログインして有効なp_auth
認証トークンを提供する必要があります。資格情報は、暗号化されていないネットワークを介して渡さないでください。Liferayサービスにアクセスするときは常にHTTPSを使用してください。ほとんどのHTTPクライアント(cURLなど)では、URLでBasic認証の資格情報を指定できます。これは、テストの際に非常に便利です。
以下の構文を使用して、資格情報からAxis Webサービスを呼び出します。
http://" + emailAddressOrScreenNameOrUserIdAsString + ":" + password + "@[server.com]:\
[port]/api/axis/" + serviceName
emailAddressOrScreenNameOrUserIdAsString
は、ユーザーの電子メールアドレス、スクリーン名、またはユーザーIDである必要があります。使用するインスタンスは、Liferayインスタンスの認証タイプの設定によって決まりますが、デフォルトでは、電子メールアドレスによる認証です。ユーザーは、ユーザーとしてログインし、[ユーザー]メニューから*[自分のアカウント]* → *[アカウント設定]*にアクセスすると、自分のユーザーIDを見つけることができます。このインターフェースでは、ユーザーIDはユーザーのプロフィール写真の下、誕生日フィールドの上に表示されます。
仮に、認証はユーザーIDで定義されており、IDが2
でパスワードがtest
のユーザーがいるとします。この場合、以下のURLでLiferayのリモート組織サービスにアクセスできます。
http://2:test@localhost:8080/api/axis/Portal_OrganizationService
電子メールアドレスがURLパスに表示される場合は、URLエンコードする必要があります(例: test@liferay.com
はtest%40liferay.com
になります)。
メールアドレスで認証を定義した場合について考えてみます。同じユーザーに対して、同じWebサービスを呼び出すには、URLを次のように変更します。
http://test%40liferay.com:test@localhost:8080/api/axis/Portal_OrganizationService
前述のように、定義した認証タイプによって、Webサービスへのアクセスに使用する認証タイプが決まります。認証タイプは、電子メールアドレス、スクリーン名、またはユーザーIDに設定できます。
認証タイプは、[コントロールパネル]またはportal-ext.properties
ファイルを介して設定できます。[コントロールパネル]を介して認証タイプを設定するには、[コントロールパネル] → [設定] → *[インスタンス設定]に移動し 、[認証]の下にある[一般]タブを選択します。[ユーザーの認証方法]*というメニューで、認証タイプを選択します。プロパティファイルを使用して認証タイプを設定するには、Liferayインスタンスのportal-ext.properties
ファイルに以下の行を追加し、適切な認証タイプの行のコメントを外します。
#company.security.auth.type=emailAddress
#company.security.auth.type=screenName
#company.security.auth.type=userId
また、パスワードポリシーは管理ユーザーに適用されるため、確認する必要があります。パスワードポリシーで定期的にパスワードを変更する必要がある場合、バッチジョブのWebサービスにアクセスする管理ユーザーのパスワードの期限も切れてしまいます。
パスワードの有効期限が切れないようにするには、パスワードの有効期限を強制しない新しいパスワードポリシーを追加してから、管理ユーザーをポリシーに追加します。そうすると、パスワードが期限切れになることなく、バッチジョブを必要な回数だけ実行できます。
以上をまとめると、Liferayにリモートでアクセスするには、以下のセキュリティチェック層に合格する必要があります。
- IPアクセス許可レイヤー:IPアドレスは、サーバーのポータルプロパティで事前に設定しておく必要があります。
- 認証/検証レイヤー(Webサービスのみ):Liferayは、呼び出し元の認可トークンをインスタンスユーザーに関連付けることができることを検証します。
- ユーザー許可レイヤー:ユーザーには、関連リソースにアクセスするための権限が必要です。
LiferayのWebサービスを呼び出すことができるクライアントアプリケーションを開発する場合は、LiferayインスタンスのWebサービスセキュリティの設定がアクセスを許可するように設定されていることを確認してください。
関連トピック