WEB开发网
开发学院软件开发Java 在 WebSphere Application Server Community Edit... 阅读

在 WebSphere Application Server Community Edition 中配置 Kerberos 验证

 2010-02-01 00:00:00 来源:WEB开发网   
核心提示: 实体使用一个共享秘密(通常是密码)对 Authentication Server 进行验证,并接收一个 Ticket Granting Ticket (TGT),在 WebSphere Application Server Community Edition 中配置 Kerberos 验证(2)

实体使用一个共享秘密(通常是密码)对 Authentication Server 进行验证,并接收一个 Ticket Granting Ticket (TGT)。然后它联系 Ticket Granting Server,使用 TGT 验证其身份并请求一个服务。TGS 验证该实体是否有权使用服务并发送一个 Service Ticket (ST)。该实体然后联系 Service Server (SS),使用 ST 证明自己有权利用服务,然后实际使用服务。实体能够重复使用 TGT 获取额外的 ST 以使用 SS,无需再次使用 AS 验证自己。Kerberos 协议经过特殊设计,无需在网络上传播共享秘密(如密码)就可以进行验证。使用 Kerberos 验证时,用户通常使用一个输入设备(如键盘)输入他们的凭证,而服务使用一个 Keytab 文件存储用户凭证,并使用它们对 KDC 进行验证。

Kerberos 和 Community Edition

Community Edition 不 提供 Kerberos 协议的实现。IBM Java Platform 通过 com.ibm.security.auth.module.Krb5LoginModule 类提供 Kerberos 协议的一个实现。为了利用 Java Platform 提供的 Kerberos 实现,我们创建一个包装 Krb5LoginModule 的 LoginModule 实现,并将所有 LoginModule API 调用委托给 Krb5LoginModule。KerberosLoginModule 的代码如清单 1 所示。

清单 1. KerberosLoginModule.java

package org.apache.geronimo.security.realm.providers; 
 
import java.security.Principal; 
import java.util.HashMap; 
import java.util.Map; 
 
import javax.security.auth.Subject; 
import javax.security.auth.callback.CallbackHandler; 
import javax.security.auth.login.LoginException; 
import javax.security.auth.spi.LoginModule; 
 
import org.apache.commons.logging.Log; 
import org.apache.commons.logging.LogFactory; 
 
public class KerberosLoginModule implements LoginModule { 
 
  private static Log log = LogFactory.getLog(KerberosLoginModule.class); 
  private Subject subject; 
  private LoginModule krb5LoginModule; 
  private Subject krb5Subject; 
  private Principal addOnPrincipal; 
 
  public void initialize(Subject subject, CallbackHandler callbackHandler, 
 Map sharedState, Map options) { 
    this.subject = subject; 
    String krb5LoginModuleClass = (String) options.get("krb5LoginModuleClass"); 
    try { 
      krb5LoginModule = (LoginModule)Class.forName(krb5LoginModuleClass) 
.newInstance(); 
    } catch (Exception e) { 
      log.error("Initialization failed", e); 
      throw new IllegalArgumentException("Unable to configure 
kerberos login module: " + e.getMessage(),e); 
    } 
     
    Map options1 = new HashMap(); 
    for(Object key : options.keySet()) { 
      String key1 = (String) key; 
      if(key1.startsWith("krb_")) { 
        options1.put(key1.substring(4), options.get(key1)); 
      } 
    } 
     
    krb5Subject = new Subject(); 
krb5LoginModule.initialize(krb5Subject, callbackHandler, sharedState, 
options1); 
String addOnPrincipalClass = (String) options.get("addOnPrincipalClass"); 
String addOnPrincipalName = (String) options.get("addOnPrincipalName"); 
if(addOnPrincipalClass != null && !addOnPrincipalClass.equals("")) { 
  try { 
  addOnPrincipal = (Principal) Class.forName(addOnPrincipalClass).getConstructor 
  (String.class).newInstance(addOnPrincipalName); 
      } catch (Exception e) { 
       log.error("Initialization failed", e); 
       throw new IllegalArgumentException("Unable to configure kerberos login 
       module: " + e.getMessage(), e); 
      } 
    } 
  } 
 
  public boolean login() throws LoginException { 
    return krb5LoginModule.login(); 
  } 
 
  public boolean commit() throws LoginException { 
    boolean result = krb5LoginModule.commit(); 
    if(result) { 
     if(addOnPrincipal != null) subject.getPrincipals().add(addOnPrincipal); 
 
subject.getPrincipals().addAll(krb5Subject.getPrincipals()); 
    subject.getPublicCredentials().addAll(krb5Subject.getPublicCredentials()); 
    subject.getPrivateCredentials().addAll(krb5Subject.getPrivateCredentials()); 
    } 
    return result; 
  } 
 
public boolean abort() throws LoginException { 
    return krb5LoginModule.abort(); 
  } 
 
public boolean logout() throws LoginException { 
  if(!subject.isReadOnly()) { 
  // Remove principals and credentials added by this LoginModule 
  if(addOnPrincipal != null) subject.getPrincipals().remove(addOnPrincipal); 
subject.getPrincipals().removeAll(krb5Subject.getPrincipals()); 
 
  subject.getPublicCredentials().removeAll(krb5Subject.getPublicCredentials()); 
  subject.getPrivateCredentials().removeAll(krb5Subject.getPrivateCredentials()); 
    } 
    return krb5LoginModule.logout(); 
  } 
}

上一页  1 2 3 4 5 6 7  下一页

Tags:WebSphere Application Server

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接