ExternalizableSecurityCheck の実装

improve this page | report issue

概説

抽象 ExternalizableSecurityCheck クラスは、SecurityCheck インターフェースを実装し、セキュリティー検査機能の 2 つの重要な側面、すなわち外部化と状態管理を処理します。

  • 外部化 - このクラスは、Externalizable インターフェースを実装して、派生クラスがこのインターフェースを実装する必要がなくなるようにします。
  • 状態管理 - このクラスは、STATE_EXPIRED 状態を事前定義します。これは、セキュリティー検査を期限切れにし、その状態が保持されないようにすることを意味します。派生クラスは、それぞれのセキュリティー検査によってサポートされるその他の状態を定義する必要があります。

サブクラスでは、3 つのメソッドを実装する必要があります。それらは、initStateDurationsauthorize、および introspect です。

このチュートリアルでは、クラスを実装する方法について説明し、状態を管理する方法を例示します。

前提条件: 許可の概念およびセキュリティー検査の作成のチュートリアルをお読みください。

ジャンプ先:

initStateDurations メソッド

ExternalizableSecurityCheck によって、initStateDurations という抽象メソッドが定義されます。サブクラスは、それぞれのセキュリティー検査でサポートされるすべての状態について、名前と期間を指定することで、このメソッドを実装する必要があります。期間の値は、通常、セキュリティー検査構成から取得されます。

private static final String SUCCESS_STATE = "success";

protected void initStateDurations(Map<String, Integer> durations) {
    durations.put (SUCCESS_STATE, ((SecurityCheckConfig) config).successStateExpirationSec);
}

セキュリティー検査構成について詳しくは、『CredentialsValidationSecurityCheck の実装』チュートリアルの構成クラスのセクションを参照してください。

authorize メソッド

SecurityCheck インターフェースによって、authorize というメソッドが定義されます。このメソッドが、セキュリティー検査のメイン・ロジックの実装、状態の管理、およびクライアントへの応答の送信 (成功、チャレンジ、または失敗) の責任を負います。

状態の管理には、以下のヘルパー・メソッドを使用します。

protected void setState(String name)
public String getState()

以下のサンプルは、ユーザーがログインしているかどうかを単純にチェックし、その結果に応じて成功または失敗を返します。

public void authorize(Set<String> scope, Map<String, Object> credentials, HttpServletRequest request, AuthorizationResponse response) {
    if (loggedIn){
        setState(SUCCESS_STATE);
        response.addSuccess(scope, getExpiresAt(), this.getName());
    } else  {
        setState(STATE_EXPIRED);
        Map <String, Object> failure = new HashMap<String, Object>();           
        failure.put("failure", "User is not logged-in");
        response.addFailure(getName(), failure);
    }
}

AuthorizationResponse.addSuccess メソッドは、成功のスコープとその有効期限を応答オブジェクトに追加します。これは以下を必要とします。

  • セキュリティー検査によって認可されたスコープ。
  • 認可されたスコープの有効期限。
    getExpiresAt ヘルパー・メソッドは、現在の状態の有効期限が切れる時間か、現在の状態がヌルの場合には 0 を返します。

    public long getExpiresAt()
    
  • セキュリティー検査の名前。

AuthorizationResponse.addFailure メソッドは、失敗を応答オブジェクトに追加します。これは以下を必要とします。

  • セキュリティー検査の名前。
  • 失敗 Map オブジェクト。

AuthorizationResponse.addChallenge メソッドは、チャレンジを応答オブジェクトに追加します。これは以下を必要とします。

  • セキュリティー検査の名前。
  • チャレンジ Map オブジェクト。

introspect メソッド

SecurityCheck インターフェースによって、introspect というメソッドが定義されます。このメソッドにより、セキュリティー検査の状態が、要求されたスコープを認可しているかどうかが検査されます。スコープが認可されている場合、セキュリティー検査は、認可されるスコープ、その有効期限、およびカスタムのイントロスペクション・データを結果のパラメーターに報告しなければなりません。スコープが認可されていない場合、セキュリティー検査は何も行いません。
このメソッドによって、セキュリティー検査の状態またはクライアント登録レコード、あるいはその両方が変更されることがあります。

public void introspect(Set<String> checkScope, IntrospectionResponse response) {
    if (getState().equals(SUCCESS_STATE)) {
        response.addIntrospectionData(getName(),checkScope,getExpiresAt(),null);
    }
}

AuthorizationContext オブジェクト

ExternalizableSecurityCheck クラスは、AuthorizationContext authorizationContext オブジェクトを提供します。このオブジェクトは、セキュリティー検査の現行クライアントに関連した一時データを保管するために使用されます。
データの保管と取得には、以下のメソッドを使用します。

  • 現行クライアントに関して、このセキュリティー検査によって設定された認証済みユーザーを取得します。

    AuthenticatedUser getActiveUser();
    
  • このセキュリティー検査で使用する現行クライアントのアクティブ・ユーザーを設定します。

    void setActiveUser(AuthenticatedUser user);
    

RegistrationContext オブジェクト

ExternalizableSecurityCheck クラスは、RegistrationContext registrationContext オブジェクトを提供します。このオブジェクトは、現行クライアントに関連した永続データ/デプロイメント・データを保管するために使用されます。
データの保管と取得には、以下のメソッドを使用します。

  • 現行クライアントに関して、このセキュリティー検査によって登録されたユーザーを取得します。

    AuthenticatedUser getRegisteredUser();
    
  • 現行クライアントを対象に、指定されたユーザーを登録します。

    setRegisteredUser(AuthenticatedUser user);
    
  • 現行クライアントの公開されている永続属性を取得します。

    PersistentAttributes getRegisteredPublicAttributes();
    
  • 現行クライアントの保護されている永続属性を取得します。

    PersistentAttributes getRegisteredProtectedAttributes();
    
  • 指定された検索基準を使用して、モバイル・クライアントの登録データを検索します。

    List<ClientData> findClientRegistrationData(ClientSearchCriteria criteria);
    

サンプル・アプリケーション

ExternalizableSecurityCheck を実装するサンプルについては、登録チュートリアルを参照してください。

Last modified on November 15, 2017