Flex Gateway新着情報
Governance新着情報
Monitoring API Managerこのハンドラーでは、特定の要求に基づいて、暗号化および着信認証に使用される現在のコンテキストの認証を設定できます。
操作に AuthenticationHandler
型のパラメーターを追加すると、現在のコンテキストの認証ハンドラーインスタンスが実行時に挿入されます。このインスタンスを使用して現在の認証 (存在する場合) を確認し、新しい認証を設定できます。
認証ハンドラーインターフェースには次のメソッドがあります。
createCredentialsBuilder
: Credentials
インスタンスの作成に使用されるビルダーを返す。
createAuthentication
: Credentials
のインスタンスが指定されたときに、Authentication
インスタンスを作成する。
setAuthentication
: Authentication
が指定されたときに、その値を現在のコンテキストの認証として設定する。必要に応じて、SecurityManager
に追加されるセキュリティプロバイダー (名前) のリストを指定することもできます。
getAuthentication
: 現在のコンテキストから Authentication
を返す。現在のコンテキストに Authentication
がない場合もあります。
HTTP 要求を受信した後に、現在のコンテキストの認証ハンドラーでログイン情報を認証して保存するとします。このユースケースでは、HTTP Connector の basic-security-filter
操作を使用できます。
次の簡略化された例は、basic-security-filter
の実装方法を示しています。
public class HttpOperations {
/**
* Authenticates received HTTP requests. Must be used after a listener component.
*/
@Throws(BasicSecurityErrorTypeProvider.class)
public void basicSecurityFilter(@ParameterGroup(name = "Security Filter") HttpBasicAuthenticationFilter filter,
AuthenticationHandler authenticationHandler) { (1)
try {
filter.authenticate(authenticationHandler);
} catch (BasicUnauthorisedException e) {
throw new ModuleException(BASIC_AUTHENTICATION, e);
} catch (SecurityProviderNotFoundException | SecurityException | UnknownAuthenticationTypeException e) {
throw new ModuleException(SERVER_SECURITY, e);
}
}
// ...
}
1 | この操作には、実行時に挿入される AuthenticationHandler パラメーターがあります。 |
public class HttpBasicAuthenticationFilter {
@Parameter
private String realm;
@Parameter
@Optional
@NullSafe
private List<String> securityProviders;
@Parameter
@Optional(defaultValue = "#[attributes]")
HttpRequestAttributes attributes; (1)
public void authenticate(AuthenticationHandler authenticationHandler)
throws SecurityException, SecurityProviderNotFoundException, UnknownAuthenticationTypeException {
String header = attributes.getHeaders().get("Authorization".toLowerCase());
if ((header != null) && header.startsWith("Basic ")) {
String username = retrieveUsername(header);
String password = retrievePassword(header);
Credentials credentials = authenticationHandler.createCredentialsBuilder() (2)
.withUsername(username)
.withPassword(password.toCharArray())
.build();
try {
Authentication authentication = authenticationHandler.createAuthentication(credentials); (3)
authenticationHandler.setAuthentication(securityProviders, authentication); (4)
} catch (UnauthorisedException e) { (5)
throw new BasicUnauthorisedException(authFailedForUser(username), e);
}
} else if (header == null) {
throw new BasicUnauthorisedException(null, "HTTP basic authentication", "HTTP listener");
} else {
throw new UnsupportedAuthenticationSchemeException("Http Basic filter doesn't know how to handle header " + header));
}
}
}
1 | ユーザー名とパスワードが取得される場所の HttpRequestAttributes 。 |
2 | Credentials は、要求から取得した情報を使用して作成されます。 |
3 | Authentication は Credentials に基づいて作成されます。 |
4 | 認証情報が securityProviders に対してチェックされ、ハンドラーに
設定されます。 |
5 | 認証情報が無効な場合、例外がスローされます。 |
認証ハンドラーをパラメーターとして持つフロー内に別の操作がある場合、挿入されるインスタンスは、basic-authentication-filter
操作で処理されるインスタンスと同じになります。これにより、getAuthentication
メソッドを使用して、HTTP 要求からログイン情報と共に Authentication
を取得します。