É possível mapear o nome do principal cliente
Kerberos para o ID do registro do usuário WebSphere para a autenticação
da Web Simple and Protected GSS-API Negotiation (SPNEGO)
e para a autenticação Kerberos.
Sobre Esta Tarefa
Utilize o módulo de login customizado JAAS (Java Authentication and Authorization Service)
para desempenhar qualquer mapeamento customizado de um nome de proprietário do Kerberos do cliente
para a identidade do registro do usuário do WebSphere. O módulo de login
customizado JAAS é um mecanismo de plug-in que é definido para a autenticar solicitações
recebidas no WebSphere Application Server. Se o mecanismo de autenticação ativo for o LTPA, o
módulo de login customizado JAAS será inserido imediatamente antes do
ltpaLoginModule.
Se o mecanismo de autenticação ativo for Kerberos, o módulo de login customizado JAAS será inserido imediatamente antes de WSKrb5LoginModule.
O módulo de login customizado
JAAS recupera um nome do principal do Kerberos cliente no
javax.security.auth.Subject usando o métodosubject.getPrivateCredentials(KRBAuthnToken.class).
O módulo de login customizado JAAS, então, mapeia o nome do principal do Kerberos cliente para a
identidade do registro do usuário do WebSphere e insere a identidade de mapeamento na
propriedade hashtable, com.ibm.wsspi.security.cred.userId.
O wsMapDefaultInboundLoginModule então utiliza a identidade mapeada para
criar uma WSCredential.
Nota: Para autenticação da Web de SPNEGO, o módulo de login
customizado também pode fornecer o conjunto completo de propriedades de segurança no javax.security.auth.Subject no
com.ibm.wsspi.security.tai.TAIResult para asserção completa
da identidade mapeada. Quando a identidade estiver completamente asserida, o wsMapDefaultInboundLoginModule mapeará
essas propriedades de segurança para uma WSCredential.
- Consulte o exemplo a seguir de um módulo de login customizado:
package com.ibm.websphere.security;
import java.util.Map;
import java.lang.reflect.Array;
import javax.security.auth.Subject;
import javax.security.auth.callback.*;
import javax.security.auth.login.LoginException;
import javax.security.auth.spi.LoginModule;
import javax.security.auth.kerberos.*;
import com.ibm.websphere.security.auth.WSLoginFailedException;
import com.ibm.wsspi.security.token.AttributeNameConstants;
import com.ibm.wsspi.wssecurity.platform.token.KRBAuthnToken;
/**
*
* @author IBM Corporation
* @version 1.0
* @since 1.0
*
*/
public class sampleSpnegoMappingLoginModule implements LoginModule {
/*
*
* Constante que representa o nome desse módulo de mapeamento. Sempre que essa amostra
* de código for utilizada para criar uma classe com um nome diferente, esse valor deve ser alterado.
*
*/
private final static String MAPPING_MODULE_NAME = "com.ibm.websphere.security.sampleSpnegoMappingLoginModule";
private String mapUid = null;
/**
* Construir um objeto WSLoginModuleImpl não inicializado.
*/
public sampleSpnegoMappingLoginModule() {
debugOut("sampleSpnegoMappingLoginModule() entry");
debugOut("sampleSpnegoMappingLoginModule() exit");
}
/**
* Inicialize esse módulo de login.
*
*
* Ele é chamado pelo LoginContext depois que esse módulo de login é
* instanciado. As informações relevantes são transmitidas do LoginContext
* para esse módulo de login. Se o módulo de login não entender os dados
* armazenados no sharedState e parâmetros opcionais,
* eles podem ser ignorados.
*
*
* @param subject O sujeito a ser autenticado.
* @param callbackHandler
* Um CallbackHandler para se comunicar com o usuário final para reunir informações de login (por exemplo, nome de usuário e senha).
* @param sharedState
* O estado compartilhado com outros módulos de login configurados.
* @param options As opções especificadas na configuração de login para este módulo de login específico.
*/
public void initialize(Subject subject, CallbackHandler callbackHandler,
Map sharedState, Map options) {
debugOut("initialize(subject = \"" + subject.toString() +
"\", callbackHandler = \"" + callbackHandler.toString() +
"\", sharedState = \"" + sharedState.toString() +
"\", options = \"" + options.toString() + "\")");
this.subject = subject;
this.callbackHandler = callbackHandler;
this.sharedState = sharedState;
this.options = options;
debug = "true".equalsIgnoreCase((String)this.options.get("debug"));
debugOut("initialize() exit");
}
/**
*
* Método para autenticar um Subject (fase 1).
*
*
*
* Este método autentica um Subject. Ele utiliza o CallbackHandler para reunir
* as informações do Subject, tais como nome do usuário e senha, por exemplo, e verifica essas
* informações. O resultado da autenticação é salvo no estado privado dentro
* deste módulo de login.
*
*
* @retornar verdadeiro se a autenticação for bem-sucedida, ou falso
* se este módulo de login deve ser ignorado.
* @exception LoginException
* Se a autenticação falhar.
*/
public boolean login() throws LoginException
{
debugOut("sampleSpnegoMappingLoginModule.login() entry");
boolean succeeded = false;
KRBAuthnToken krbAuthnToken = null;;
java.util.Set krb5Principals= subject.getPrivateCredentials(KRBAuthnToken.class);
java.util.Iterator krb5PrincIter = krb5Principals.iterator();
while (krb5PrincIter.hasNext()) {
krbAuthnToken = (KRBAuthnToken)krb5PrincIter.next();
String kerbPrincipal = (String) krbAuthnToken.getTokenPrincipal() + "@" + krbAuthnToken.getTokenRealm();
debugOut("Kerberos principal name: "+ kerbPrincipal.toString());
if (kerbPrincipal!= null && kerbPrincipal.equals("utle@WSSEC.AUSTIN.IBM.COM")){
mapUid = "user1";
debugOut("mapUid: "+mapUid);
java.util.Hashtable customProperties = (java.util.Hashtable)
sharedState.get(AttributeNameConstants.WSCREDENTIAL_PROPERTIES_KEY);
if (customProperties == null) {
customProperties = new java.util.Hashtable();
}
succeeded = true;
customProperties.put(AttributeNameConstants.WSCREDENTIAL_USERID, mapUid);
Map<String,java.util.Hashtable>mySharedState=(Map<String,java.
util.Hashtable>)sharedState;
mySharedState.put(AttributeNameConstants.WSCREDENTIAL_PROPERTIES_KEY,
customProperties);
debugOut("Incluir um ID de usuário de mapeamento na Hashtable, ID do mapeamento = "+mapUid);
debugOut("login() custom properties = " + customProperties);
}
}
succeeded = true;
debugOut("sampleSpnegoMappingLoginModule.login() exit");
return succeeded;
}
/**
*
* Método para confirmar o resultado da autenticação (fase 2).
*
*
*
* Esse método será chamado se a autenticação geral do LoginContext
* obteve êxito (o módulo de login REQUIRED, REQUISITE, SUFFICIENT e OPTIONAL
* obteve êxito).
*
*
* @retornar true se a confirmação for bem-sucedida, ou false
* se este módulo de login deve ser ignorado.
* @exception LoginException
* Se a confirmação falhar.
*/
public boolean commit() throws LoginException
{
debugOut("commit()");
debugOut("commit()");
return true;
}
/**
* Método para interromper o processo de autenticação (fase 2).
*
*
* Esse método será chamado se a autenticação geral do LoginContext
* falhou (o módulo de login REQUIRED, REQUISITE, SUFFICIENT e OPTIONAL
* não obteve êxito).
*
*
*
* Se a tentativa de autenticação deste módulo de login obteve êxito, este método limpa
* o estado anterior salvo na fase 1.
*
*
* @retornar verdadeiro se a interrupção for bem-sucedida, ou falso
* se este módulo de login deve ser ignorado.
* @exception LoginException
* Se a interrupção falhar.
*/
public boolean abort() throws LoginException {
debugOut("abort() entry");
debugOut("abort() exit");
return true;
}
/**
* Método que efetua logout de um Subject.
*
* @retornar true se a logout for bem-sucedido, ou false
* se este módulo de login deve ser ignorado.
* @exception LoginException
* Se o logout falhar.
*/
public boolean logout() throws LoginException
{
debugOut("logout() entry");
debugOut("logout() exit");
return true;
}
private void cleanup()
{
debugOut("cleanup() entry");
debugOut("cleanup() exit");
}
/*
*
* Método privado para imprimir informações de rastreio. A implementação utiliza System.out
* para imprimir informações de rastreio de saída padrão, mas um sistema de rastreio personalizado pode
* ser implementado aqui também.
*
*/
private void debugOut(Object o)
{
System.out.println("Debug: " + MAPPING_MODULE_NAME);
if (o != null) {
if (o.getClass().isArray()) {
int length = Array.getLength(o);
for (int i = 0; i < length; i++) {
System.out.println("\t" + Array.get(o, i));
}
} else {
System.out.println("\t" + o);
}
}
}
private Subject subject;
private CallbackHandler callbackHandler;
private Map sharedState;
private Map options;
protected boolean debug = false;
}
- Para a autenticação da Web SPNEGO sem a autenticação
Kerberos, esse módulo de login do JAAS customizado deve primeiro ser inserido imediatamente antes do
ltpaLoginModule no login de pilha da configuração de logon do sistema
para WEB_INBOUND, RMI_INBOUND e DEFAULT.
- Para a autenticação Kerberos,
esse módulo de login customizado JAAS deve ser inserido imediatamente antes do
WSKrb5LoginModule para a configuração de login do sistema
para WEB_INBOUND, RMI_INBOUND e DEFAULT.