[AIX Solaris HP-UX Linux Windows][z/OS]

SCA RequestContext.getSecuritySubject() API の使用

サービス・コンポーネント・アーキテクチャー (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 を使用する場合、以下のステップを実行します。

手順

  1. ファイル内の 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;
  2. 以下の例にあるように、要求のさまざまなセキュリティー属性をサブジェクト内の 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