サービス・コンポーネント・アーキテクチャー (SCA) の RequestContext.getSecuritySubject()
アプリケーション・プログラミング・インターフェースは、Java Authentication and Authorization (JAAS) サブジェクトを返します。これは、保護された SCA サービスにアクセスする認証済みユーザーを表します。
事前処理
SCA サービス開発者は、RequestContext.getSecuritySubject() API を使用して、要求側を表す JAAS サブジェクトを取得します。
以下の前提条件の 1 つ以上が満たされない場合、SCA 要求は認証されず、RequestContext.getSecuritySubject API はヌル Subject を戻します。
- セキュリティー・インフラストラクチャーを初期化するには、管理セキュリティーを使用可能にしなければなりません。
- セキュリティー・ポリシーおよび認証を有効にするには、アプリケーション・セキュリティーを使用可能にしなければなりません。
- SCA サービスは、認証済みユーザーを要求する必要があります。 認証は、
authentication.transport インテント (OSOA コンポジットの場合) または clientAuthentication.transport インテント (OASIS コンポジットの場合) を使用して、トランスポート層で行うことができます。 また、認証を要求する Web サービス・ポリシー・セットを関連付けると、メッセージ層で認証を行うことができます。
このタスクの概要
RequestContext.getSecuritySubject() API を使用する場合、以下のステップを実行します。
手順
- ファイル内の RequestContext.getSecuritySubject API を使用します。
以下の例では、OSOA RequestContext.getSecuritySubject API を使用します。
import org.osoa.sca.annotations.Context;
import org.osoa.sca.annotations.Service;
import org.osoa.sca.RequestContext;
import javax.security.auth.Subject;
import java.security.Principal;
import java.util.Iterator;
import com.ibm.websphere.security.cred.WSCredential;
@Service(EchoService.class)
public class EchoServiceWithIdentityComponentImpl implements EchoService
{
@Context
protected RequestContext requestContext;
public String echo_String(String input)
{
try {
Subject subject = null;
String securityName = null;
if (requestContext != null) {
subject = requestContext.getSecuritySubject();
}
if (subject != null) {
java.util.Set principalSet = subject.getPrincipals();
if (principalSet != null && principalSet.size() > 0) {
Iterator principalIterator = principalSet.iterator();
if (principalIterator.hasNext()) {
Principal principal = (java.security.Principal) principalIterator.next();
securityName = principal.getName();
}
}
}
} catch (Exception ex) {
// Handle exception
}
}
}
OASIS RequestContext.getSecuritySubject API を使用する場合も同じ例が適用されますが、例外としてパッケージ名が以下のように変更されます。
import org.oasisopen.sca.annotation.Context;
import org.oasisopen.sca.annotation.Service;
import org.oasisopen.sca.RequestContext;
- 以下の例にあるように、要求のさまざまなセキュリティー属性をサブジェクト内の WSCredential オブジェクトから取得できます。
if (subject != null) {
java.util.Set credSet = subject.getPublicCredentials();
if (credSet != null && credSet.size() > 0)
{
Iterator credIterator = credSet.iterator();
while (credIterator.hasNext()) {
Object o = credIterator.next();
WSCredential cred = null;
if (o instanceof WSCredential) {
cred = (WSCredential) o;
} else {
if (securityName == null) {
securityName = new StringBuffer();
}
securityName.append("\n>> Found a public credential: " + o.getClass().getName());
}
if (cred != null) {
if (securityName == null) {
securityName = new StringBuffer();
}
securityName.append("\n>> WSCredential security attributes . . .");
securityName.append("\n>> getAccessId = \t\t" + cred.getAccessId());
securityName.append("\n>> getGroupIds = \t\t" + cred.getGroupIds());
securityName.append("\n>> getPrimaryGroupId = \t\t" + cred.getPrimaryGroupId());
securityName.append("\n>> getRealmName = \t\t" + cred.getRealmName());
securityName.append("\n>> getRealmSecurityName = \t\t" + cred.getRealmSecurityName());
securityName.append("\n>> getRealmUniqueSecurityName = \t\t" + cred.getRealmUniqueSecurityName());
securityName.append("\n>> getSecurityName = \t\t" + cred.getSecurityName());
securityName.append("\n>> getUniqueSecurityName = \t\t" + cred.getUniqueSecurityName());
}
}
}
}
プリンシパル ID は、レルム名の後に要求側の ID が続く形で構成されます。 例えば、
WebSphere® Application Server認証に Lightweight Directory Access Protocol (LDAP) サーバーを使用するように構成されています。 レルム名は LDAP サーバーのホスト名およびポート番号です。
security name = ldap1.austin.ibm.com:389/user2
出力のサンプルを次に示します。
>> WSCredential security attributes . . .
>> getAccessId = user:ldap1.austin.ibm.com:389/cn=user2,o=ibm,c=us
>> getGroupIds = [group:ldap1.austin.ibm.com:389/CN=GROUP2,O=IBM,C=US]
>> getPrimaryGroupId = group:ldap1.austin.ibm.com:389/CN=GROUP2,O=IBM,C=US
>> getRealmName = ldap1.austin.ibm.com:389
>> getRealmSecurityName = ldap1.austin.ibm.com:389/user2
>> getRealmUniqueSecurityName = ldap1.austin.ibm.com:389/cn=user2,o=ibm,c=us
>> getSecurityName = user2
>> getUniqueSecurityName = cn=user2,o=ibm,c=us