Tomcat 7 で実行できるように、Web アプリのコードを IBM WAS 7 に移植することを検討するよう依頼されました。
これは大規模な SPNEGO/Kerberos SSO システムの一部ですが、説明のために、2 つの WebSphere クラス AccessController と WSSubject への依存関係を示すコードを次のように要約しました。
GSSCredential clientCreds = (GSSCredential) com.ibm.ws.security.util.AccessController.doPrivileged(new java.security.PrivilegedAction() {
public Object run() {
javax.security.auth.Subject subject = com.ibm.websphere.security.auth.WSSubject.getCallerSubject();
GSSCredential clientCreds = (GSSCredential) subject.getPrivateCredentials(GSSCredential.class).iterator().next();
return clientCreds;
}
});
Tomcatでこれを実行できるようにしたいです。
[編集] 上記の要約されたコードは、おそらく何が必要かを明確に説明していないと思います。Web アプリへのアクセスを制御するために Tomcat を構成する必要も、リモート ユーザーになりすます必要もありません。実際に必要なのは、暗号化されていない Kerberos チケットです。これにより、認証を完了する別のプロセスにそれを渡すことができます。より完全なスニペットを次に示します。
com.ibm.ws.security.util.AccessController.doPrivileged(new java.security.PrivilegedAction() {
public Object run() {
Oid krb5Mechanism = new Oid("1.2.840.113554.1.2.2");
Oid krb5PrincipalNameType = new Oid("1.2.840.113554.1.2.2.1");
GSSManager manager = GSSManager.getInstance();
GSSName serverName = manager.createName("HOST/my.host.org", krb5PrincipalNameType);
javax.security.auth.Subject subject = com.ibm.websphere.security.auth.WSSubject.getCallerSubject();
GSSCredential clientCreds = (GSSCredential) subject.getPrivateCredentials(GSSCredential.class).iterator().next();
GSSContext secContext = manager.createContext(serverName, krb5Mechanism, clientCreds, GSSContext.DEFAULT_LIFETIME);
// After this the Kerberos ticket is extracted from secContext, converted to a String and passed to the other process for authentication
}
});