ExternalizableSecurityCheck の実装
improve this page | report issue概説
抽象 ExternalizableSecurityCheck
クラスは、SecurityCheck
インターフェースを実装し、セキュリティー検査機能の 2 つの重要な側面、すなわち外部化と状態管理を処理します。
- 外部化 - このクラスは、
Externalizable
インターフェースを実装して、派生クラスがこのインターフェースを実装する必要がなくなるようにします。 - 状態管理 - このクラスは、
STATE_EXPIRED
状態を事前定義します。これは、セキュリティー検査を期限切れにし、その状態が保持されないようにすることを意味します。 派生クラスは、それぞれのセキュリティー検査によってサポートされるその他の状態を定義する必要があります。
サブクラスでは、3 つのメソッドを実装する必要があります。それらは、initStateDurations
、authorize
、および introspect
です。
このチュートリアルでは、クラスを実装する方法について説明し、状態を管理する方法を例示します。
前提条件: 許可の概念およびセキュリティー検査の作成のチュートリアルをお読みください。
ジャンプ先:
- initStateDurations メソッド
- authorize メソッド
- introspect メソッド
- AuthorizationContext オブジェクト
- RegistrationContext オブジェクト
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
を実装するサンプルについては、登録チュートリアルを参照してください。
Inclusive terminology note: The Mobile First Platform team is making changes to support the IBM® initiative to replace racially biased and other discriminatory language in our code and content with more inclusive language. While IBM values the use of inclusive language, terms that are outside of IBM's direct influence are sometimes required for the sake of maintaining user understanding. As other industry leaders join IBM in embracing the use of inclusive language, IBM will continue to update the documentation to reflect those changes.