ユーザーが承認されていない場合

  1. Dispatcher がキャッシュを調べます。
  2. Dispatcher がレンダーにリクエストメッセージを送信します。リクエストメッセージには、ブラウザーのリクエストのヘッダー行がすべて含まれます。
  3. レンダーが認証チェッカーサーブレットを呼び出してセキュリティチェックを実行し、失敗すると、Dispatcher に元のリクエストを転送します。
  4. Dispatcher が、レンダーに元のリクエストを転送します。
  5. レンダーが、AEM オーソライザーサーブレット(このサーブレットは Dispatcher 認証チェッカーサーブレットではありません)を呼び出して、セキュリティチェックを実行します。ユーザーが承認されると、レンダーは応答メッセージの本文にレンダリングされるページを含めます。
  6. Dispatcher がブラウザーに応答を転送します。Dispatcher が、レンダーの応答メッセージの本文をキャッシュに追加します。

権限を区別するキャッシュの実装

権限を区別するキャッシュを実装するには、次のタスクを実行します。

  • 認証と承認を実行するサーブレットの作成
  • Dispatcher の設定
メモ
一般的に、セキュアなリソースは、セキュアではないファイルとは別のフォルダーに保存します。例:/content/secure/
メモ
Dispatcher の前に CDN(またはその他のキャッシュ)がある場合、CDN がプライベートコンテンツをキャッシュしないように、キャッシュヘッダーを設定する必要があります。例:Header always set Cache-Control private
AEM as a Cloud Service におけるプライベートキャッシュヘッダーの設定方法について詳しくは、キャッシュページを参照してください。

認証チェッカーサーブレットの作成

Web コンテンツをリクエストするユーザーの認証と承認を実行するサーブレットを作成し、デプロイします。このサーブレットは、あらゆる認証を使用できます。また、あらゆる承認方法を使用することもできます。例えば、AEM ユーザーアカウントとリポジトリ ACL を使用できます。または、LDAP 検索サービスを使用できます。Dispatcher がレンダーとして使用する AEM インスタンスにサーブレットをデプロイします。

このサーブレットには、すべてのユーザーがアクセスできる必要があります。そのため、サーブレットは、org.apache.sling.api.servlets.SlingSafeMethodsServlet クラスを拡張して、システムに対して読み取り専用アクセス権を付与する必要があります。

サーブレットは、レンダーから HEAD 要求のみを受信するので、実装する必要があるのは doHead メソッドだけです。

レンダーには、要求されたリソースの URI が HTTP 要求のパラメーターとして含まれます。例えば、承認サーブレットには、/bin/permissioncheck からアクセスします。/content/geometrixx-outdoors/en.html ページに対するセキュリティチェックを実行するために、レンダーは HTTP 要求に次の URL を含めます。

/bin/permissioncheck?uri=/content/geometrixx-outdoors/en.html

このサーブレットの応答メッセージには、次の HTTP ステータスコードを含める必要があります。

  • 200:認証および承認が成功しました。

次のサンプルサーブレットは、リクエストされたリソースの URL を HTTP リクエストから取得します。このコードでは、Felix SCR の Property 注釈を使用して、sling.servlet.paths プロパティの値を /bin/permissioncheck に設定しています。doHead メソッドでは、サーブレットがセッションオブジェクトを取得し、checkPermission メソッドを使用して適切な応答コードを判断します。

メモ
sling.servlet.paths プロパティの値は、Sling Servlet Resolver(org.apache.sling.servlets.resolver.SlingServletResolver)サービスで有効にする必要があります。

サンプルサーブレット

package com.adobe.example;

import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Service;
import org.apache.felix.scr.annotations.Property;

import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.servlets.SlingSafeMethodsServlet;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.jcr.Session;

@Component(metatype=false)
@Service
public class AuthcheckerServlet extends SlingSafeMethodsServlet {

    @Property(value="/bin/permissioncheck")
    static final String SERVLET_PATH="sling.servlet.paths";

    private Logger logger = LoggerFactory.getLogger(this.getClass());

    public void doHead(SlingHttpServletRequest request, SlingHttpServletResponse response) {
     try{
      //retrieve the requested URL
      String uri = request.getParameter("uri");
      //obtain the session from the request
      Session session = request.getResourceResolver().adaptTo(javax.jcr.Session.class);
      //perform the permissions check
      try {
       session.checkPermission(uri, Session.ACTION_READ);
       logger.info("authchecker says OK");
       response.setStatus(SlingHttpServletResponse.SC_OK);
      } catch(Exception e) {
       logger.info("authchecker says READ access DENIED!");
       response.setStatus(SlingHttpServletResponse.SC_FORBIDDEN);
      }
     }catch(Exception e){
      logger.error("authchecker servlet exception: " + e.getMessage());
     }
    }
}