Desenvolvendo Módulos de Login Customizado para uma Configuração de Login do Sistema para JAAS
Para o WebSphere Application Server, existem vários pontos de plug-in do JAAS (Java™ Authentication and Authorization Service) para configurar logins do sistema. O WebSphere Application Server utiliza configurações de login do sistema para autenticar pedidos de entrada, pedidos de saída e logins internos do servidor.
Sobre Esta Tarefa
- WEB_INBOUND
- RMI_OUTBOUND
- RMI_INBOUND
- DEFAULT
Procedimento
- Autentique as solicitações da Web com a configuração de login WEB_INBOUND.
A configuração de login WEB_INBOUND autentica as solicitações da Web.
Para obter informações mais detalhadas sobre a configuração WEB_INBOUND incluindo seus retornos de chamadas associados, consulte "RMI_INBOUND, WEB_INBOUND, DEFAULT" em Definições de Entrada de Configuração de Login do Sistema para o Java Authentication and Authorization Service.
A Figura 1 mostra um exemplo de uma configuração utilizando um TAI (Trust Association Interceptor) que cria um Assunto com as informações iniciais transmitidas para a configuração de login WEB_INBOUND. Se o Trust Association Interceptor não estiver configurado, o processo de autenticação irá diretamente para a configuração de login do sistema WEB_INBOUND, que consiste em todos os módulos de login combinados na Figura 1. A Figura 1 mostra onde é possível conectar os módulos de login customizados e onde os módulos de login ltpaLoginModule e wsMapDefaultInboundLoginModule são requeridos.Figura 1. Configuração de Login do WEB_INBOUND - Identifique os pedidos de saída com a configuração de login RMI_OUTBOUND.
A configuração de login RMI_OUTBOUND é um ponto de conexão para manipulação de pedidos de saída. O WebSphere Application Server utiliza esse ponto de conexão para criar as informações serializadas que são enviadas no recebimento de dados com base no Subject de chamada transmitido e outras informações do contexto de segurança, como tokens de propagação. Um módulo de login personalizado pode utilizar esse ponto de conexão para alterar a identidade. Para obter informações adicionais, consulte Configurando o Mapeamento de Identidade de Saída para uma Região de Destino Diferente. A Figura 2 mostra onde é possível conectar módulos de login customizados e mostra onde o módulo de login wsMapCSIv2OutboundLoginModule é requerido.
Figura 2. Configuração de Login RMI_OUTBOUNDPara obter informações adicionais sobre a configuração de login RMI_OUTBOUND incluindo seus retornos de chamadas associados, consulte "RMI_OUTBOUND" em Definições de Entrada de Configuração de Login do Sistema para o Java Authentication and Authorization Service.
- Identifique a autenticação de entrada para os pedidos de enterprise
bean com a configuração de login RMI_INBOUND.
A configuração de login RMI_INBOUND é um ponto de conexão que manipula a autenticação de entrada para pedidos de enterprise beans. O WebSphere Application Server utiliza esse ponto de conexão para um login inicial ou login de propagação. Para obter informações adicionais sobre esses dois tipos de login, consulte Propagação de Atributo de Segurança. Durante um login de propagação, esse ponto de conexão é utilizado para desserializar as informações recebidas de um servidor de envio de dados. Um módulo de login customizado pode utilizar esse ponto de conexão para alterar a identidade, manipular símbolos customizados, incluir objetos customizados no Assunto e assim por diante. Para obter informações adicionais sobre como alterar a identidade utilizando um objeto Hashtable, referenciado na Figura 3, consulte Configurando o Mapeamento de Identidade de Entrada. A Figura 3 mostra onde é possível conectar módulos de login customizados e mostra que o ltpaLoginModule e o wsMapDefaultInboundLoginModule são requeridos.
Figura 3. Configuração de Login RMI_INBOUNDPara obter informações adicionais sobre a configuração de login RMI_INBOUND incluindo seus retornos de chamadas associados, consulte "RMI_INBOUND, WEB_INBOUND, DEFAULT" em Definições de Entrada de Configuração de Login do Sistema para o Java Authentication and Authorization Service.
- Identifique todos os demais tipos de pedidos de autenticação com a
configuração de login DEFAULT. Configuração de Login DEFAULT
A configuração de login DEFAULT é um ponto de conexão de plugue que manipula todos os outros tipos de pedidos de autenticação, incluindo pedidos administrativos SOAP e autenticação interna do ID do servidor. Os logins de propagação geralmente não ocorrem nesse ponto de conexão.
Para obter informações adicionais sobre a configuração de login DEFAULT incluindo seus retornos de chamadas associados, consulte "RMI_INBOUND, WEB_INBOUND, DEFAULT" em Definições de Entrada de Configuração de Login do Sistema para o Java Authentication and Authorization Service.
- Desenvolva a lógica de configuração de login para saber quando
informações específicas estão presentes e como utilizá-las. Gravando um Módulo de LoginQuando você gravar um módulo de login que conecta-se a uma configuração de login do aplicativo ou de login do sistema do WebSphere Application Server, leia o modelo de programação JAAS, que está localizado em: http://java.sun.com/products/jaas. O modelo de programação JAAS oferece informações básicas sobre JAAS. Entretanto, antes de gravar um módulo de login para o ambiente do WebSphere Application Server, leia as seções a seguir:
- Retornos de Chamada Utilizáveis
- Variáveis de Estado Compartilhado
- Logins Iniciais versus de Propagação
- Amostra de Módulo de Login Personalizado
Retornos de Chamadas Utilizáveis
Cada configuração de login deve documentar os retornos de chamadas que são reconhecidos pela configuração de login. No entanto, os retornos de chamadas nem sempre são dados transmitidos. A configuração de login deve conter lógica para saber quando informações específicas estão presentes e como utilizar as informações. Por exemplo, se você gravar um módulo de login customizado que pode conectar-se em todas as quatro configurações de login do sistema pré-configuradas, três conjuntos de retornos de chamadas podem ser apresentados para autenticar um pedido. Outros retornos de chamadas podem ser apresentados por outras razões, incluindo a propagação e a disponibilização de outras informações para a configuração de login.
Informações de login podem ser apresentadas nas seguintes combinações:- Nome do usuário (NameCallback) e senha (PasswordCallback)
- Essas informações são uma combinação típica de autenticação.
- Apenas nome do usuário (NameCallback)
- Esta informação é utilizada para asserção de identidade, logins TAI (Trust Association Interceptor) e logins de certificado.
- Token (WSCredTokenCallbackImpl)
- Essas informações são para validação de token LTPA (Lightweight Third Party Authentication).
- Lista de token de propagação (WSTokenHolderCallback)
- Essas informações são utilizadas para um login de propagação.
As primeiras três combinações são utilizadas para autenticação típica. Entretanto, quando o retorno de chamada WSTokenHolderCallback está presente, além de uma das três primeiras combinações de informações, o login é chamado de login de propagação. Um login de propagação significa que alguns atributos de segurança são propagados para este servidor de outro servidor. Os servidores podem reutilizar esses atributos de segurança se informações de autenticação forem validadas com êxito. Em alguns casos, um retorno de chamada WSTokenHolderCallback pode não ter atributos suficientes para um login completo. Verifique o método requiresLogin no retorno de chamada WSTokenHolderCallback para determinar se um novo login é requerido. Você pode sempre ignorar as informações retornadas pelo método requiresLogin mas o resultado pode ser a duplicação de informações. A lista a seguir contém os retornos de chamada que podem estar presentes nas configurações de login do sistema. A lista inclui o nome do retorno de chamada e uma descrição de sua responsabilidade.- callbacks[0] = new javax.security.auth.callback.NameCallback("Username: ");
- Essa rotina de tratamento de retorno de chamada coleta o nome do usuário para o login. O resultado pode ser um nome do usuário para um login de autenticação básico (nome do usuário e senha) ou um nome do usuário para um login de asserção de identidade.
- callbacks[1] = new javax.security.auth.callback.PasswordCallback("Password: ", false);
- Essa rotina de tratamento de retorno de chamada coleta a senha para o login.
- callbacks[2] = new com.ibm.websphere.security.auth.callback.WSCredTokenCallbackImpl("Credential Token:");
- Essa rotina de tratamento de retorno de chamada coleta o token LTPA (Lightweight Third Party Authentication) ou outro tipo de token para o login. Ela geralmente está presente quando um nome de usuário e senha não estão presentes.
- callbacks[3] = new com.ibm.wsspi.security.auth.callback.WSTokenHolderCallback("Authz Token List:");
- Essa rotina de tratamento de retorno de chamada coleta a ArrayList de objetos TokenHolder que são retornados de uma chamada para a API WSOpaqueTokenHelper.createTokenHolderListFromOpaqueToken, utilizando o token de autorização CSIv2 (Common Secure Interoperability Versão 2) como entrada.
- callbacks[4] = new com.ibm.websphere.security.auth.callback.WSServletRequestCallback("HttpServletRequest:" );
- Essa rotina de tratamento de retorno de chamada coleta o objeto de pedido de servlet HTTP, se presente. Ela permite que módulos de login obtenham informações do pedido HTTP para serem utilizadas no login e é apresentada somente na configuração de login WEB_INBOUND.
- callbacks[5] = new com.ibm.websphere.security.auth.callback.WSServletResponseCallback("HttpServletResponse:");
- Essa rotina de tratamento de retorno de chamada coleta o objeto de resposta de servlet HTTP, se presente. Essa rotina de tratamento de retorno de chamada permite que os módulos de login incluam informações na resposta HTTP como um resultado do login. Um exemplo dessa situação pode ser a inclusão do cookie SingleSignonCookie na resposta. Essa rotina de tratamento de retorno de chamada é apresentada apenas na configuração de login WEB_INBOUND.
- callbacks[6] = new com.ibm.websphere.security.auth.callback.WSAppContextCallback("ApplicationContextCallback:");
- Esse manipulador do retorno de chamada coleta o contexto do aplicativo da Web usado durante o login. Esse manipulador de retorno de chamada consiste em um objeto HashMap, que contém o nome do aplicativo e o endereço da Web de redirecionamento, se presente. A rotina de tratamento de retorno de chamada é apresentada apenas na configuração de login WEB_INBOUND.
- callbacks[7] = new WSRealmNameCallbackImpl("Realm Name:", default_realm);
- Esse manipulador de retorno de chamada coleta o nome da região das informações de login. As informações da região nem sempre pode ser fornecido. Se as informações de região não forem fornecidas, parta da premissa de que essa é a região atual.
- callbacks[8] = new WSX509CertificateChainCallback("X509Certificate[]: ");
- Esse manipulador de retorno de chamada contém o certificado validado pelo SSL (Secure Sockets Layer) se a origem do login for um X509Certificate da autenticação de cliente SSL. O ltpaLoginModule chama as mesmas funções de mapeamento que os releases do WebSphere Application Server anteriores à versão 6.1. Contudo, passá-las em um login concede a um módulo de login customizado a oportunidade de mapear o certificado num modo customizado. Em seguida, executa um login de Hashtable. Consulte Configurando o Mapeamento de Identidade de Entrada para obter informações adicionais sobre um login de Hashtable.
- Utilize variáveis de estado compartilhado para compartilhar
informações entre os módulos de login durante a fase de login. Se você desejar acessar os objetos que o WebSphere Application Server cria durante um login, consulte as variáveis de estado compartilhado. As variáveis são configuradas nos seguintes módulos de login: ltpaLoginModule, swamLoginModule e wsMapDefaultInboundLoginModule.
- Variável de estado compartilhado
- com.ibm.wsspi.security.auth.callback.Constants.WSPRINCIPAL_KEY
- Finalidade
- Especifica o objeto com.ibm.websphere.security.auth.WSPrincipal. Consulte a documentação da API do WebSphere Application Server para uso da API (Interface de Programação de Aplicativos). Essa variável de estado compartilhada é para fins de leitura. Não defina essa variável no estado compartilhado para os módulos de login customizados.
- O módulo de login no qual as variáveis são configuradas
- ltpaLoginModule, swamLoginModule e wsMapDefaultInboundLoginModule
- Variável de estado compartilhado
- com.ibm.wsspi.security.auth.callback.Constants.WSCREDENTIAL_KEY
- Finalidade
- Especifica o objeto com.ibm.websphere.security.cred.WSCredential. Consulte a documentação da API do WebSphere Application Server para uso da API. Essa variável de estado compartilhada é para fins de leitura. Não defina essa variável no estado compartilhado para os módulos de login customizados.
- Módulo de login no qual as variáveis são definidas
- wsMapDefaultInboundLoginModule
- Variável de estado compartilhado
- com.ibm.wsspi.security.auth.callback.Constants.WSAUTHZTOKEN_KEY
- Finalidade
- Especifica o objeto com.ibm.wsspi.security.token.AuthorizationToken padrão. Os módulos de login podem utilizar esse objeto para configurar atributos customizados, conectados após o módulo de login wsMapDefaultInboundLoginModule. As informações configuradas aqui são propagadas no recebimento de dados e estão disponíveis para o aplicativo. Consulte a documentação da API do WebSphere Application Server para uso da API.
Logins Iniciais versus de Propagação
Conforme mencionado anteriormente, alguns logins são considerados logins iniciais pelos seguintes motivos:- É a primeira vez que as informações sobre autenticação são apresentadas ao WebSphere Application Server.
- As informações de login são recebidas de um servidor que não propaga atributos de segurança, portanto essas informações devem ser reunidas a partir de um registro de usuário.
Outros logins são considerados logins de propagação quando um retorno de chamada WSTokenHolderCallback está presente e contém informações suficientes de um servidor de envio para recriar todos os objetos necessários ao tempo de execução do WebSphere Application Server. Nos casos em que existem informações suficientes para o tempo de execução do WebSphere Application Server, as informações que você pode incluir no Subject provavelmente existirão do login anterior. Para verificar se seu objeto está presente, você pode obter acesso ao objeto ArrayList presente no retorno de chamada WSTokenHolderCallback e procurar e examinar nessa lista cada método getName de TokenHolder. Essa procura é utilizada para determinar se o WebSphere Application Server está desserializando o objeto customizado durante esse login. Verifique o nome da classe retornado do método getName utilizando o método String startsWith, porque o tempo de execução pode incluir informações adicionais no final do nome para saber qual Assunto está configurado para incluir o objeto personalizado após a desserialização.
- Codifique o método login() para determinar quando informações suficientes
estão presentes.
O fragmento de código a seguir pode ser utilizado em seu método login() para determinar quando há informações suficientes. Para obter outro exemplo, consulte Configurando o Mapeamento de Identidade de Entrada.
// Esta é uma sugestão fornecida pelo WebSphere Application Server que // não há informações de propagação suficientes e, portanto, // um login é requerido para fornecer as informações suficientes. Neste // situação, um login de Hashtable pode ser utilizado. boolean requiresLogin = ((com.ibm.wsspi.security.auth.callback. WSTokenHolderCallback) callbacks[1]).requiresLogin(); if (requiresLogin) { // Verifique para consultar se o objeto existe na lista TokenHolder, se não, inclua-o. java.util.ArrayList authzTokenList = ((WSTokenHolderCallback) callbacks[6]). getTokenHolderList();boolean found = false; if (authzTokenList != null) { Iterator tokenListIterator = authzTokenList.iterator(); while (tokenListIterator.hasNext()) { com.ibm.wsspi.security.token.TokenHolder th = (com.ibm.wsspi.security.token. TokenHolder) tokenListIterator.next(); if (th != null && th.getName().startsWith("com.acme.myCustomClass")) { found=true; break; } } if (!found) { // vá em frente e inclua o objeto customizado. } } } else { // Esse código indica que há informações de propagação suficientes. // As chamadas de registro do usuário não são necessárias ao WebSphere Application Server para // criar um Subject válido. Esse código pode ser um no-op em seu módulo de login. }
Amostra de Módulo de Login Personalizado
É possível utilizar a seguinte amostra para se obter ideias sobre como utilizar alguns dos retornos de chamada e variáveis de estado compartilhadas.
{ // Define as variáveis do módulo de login com.ibm.wsspi.security.token.AuthenticationToken customAuthzToken = null; com.ibm.wsspi.security.token.AuthenticationToken defaultAuthzToken = null; com.ibm.websphere.security.cred.WSCredential credential = null; com.ibm.websphere.security.auth.WSPrincipal principal = null; private javax.security.auth.Subject _subject; private javax.security.auth.callback.CallbackHandler _callbackHandler; private java.util.Map _sharedState; private java.util.Map _options; public void initialize(Subject subject, CallbackHandler callbackHandler, Map sharedState, Map options) { _subject = subject; _callbackHandler = callbackHandler; _sharedState = sharedState; _options = options; } public boolean login() throws LoginException { boolean succeeded = true; // Obtém as informações de CALLBACK javax.security.auth.callback.Callback callbacks[] = new javax.security. auth.callback.Callback[7]; callbacks[0] = new javax.security.auth.callback.NameCallback( "Username: "); callbacks[1] = new javax.security.auth.callback.PasswordCallback( "Password: ", false); callbacks[2] = new com.ibm.websphere.security.auth.callback. WSCredTokenCallbackImpl( "Credential Token: "); callbacks[3] = new com.ibm.wsspi.security.auth.callback. WSServletRequestCallback ("HttpServletRequest: "); callbacks[4] = new com.ibm.wsspi.security.auth.callback. WSServletResponseCallback ("HttpServletResponse: "); callbacks[5] = new com.ibm.wsspi.security.auth.callback. WSAppContextCallback ("ApplicationContextCallback: "); callbacks[6] = new com.ibm.wsspi.security.auth.callback. WSTokenHolderCallback ("Authz Token List: "); try { callbackHandler.handle(callbacks); } catch (Exception e) { // Handles exceptions throw new WSLoginFailedException (e.getMessage(), e); } // Verifica quais retornos de chamadas contêm informações uid = ((NameCallback) callbacks[0]).getName(); char password[] = ((PasswordCallback) callbacks[1]).getPassword(); byte[] credToken = ((WSCredTokenCallbackImpl) callbacks[2]).getCredToken(); javax.servlet.http.HttpServletRequest request = ((WSServletRequestCallback) callbacks[3]).getHttpServletRequest(); javax.servlet.http.HttpServletResponse response = ((WSServletResponseCallback) callbacks[4]).getHttpServletResponse(); java.util.Map appContext = ((WSAppContextCallback) callbacks[5]).getContext(); java.util.List authzTokenList = ((WSTokenHolderCallback) callbacks[6]).getTokenHolderList(); // Obtém as informações de SHARED STATE principal = (WSPrincipal) _sharedState.get(com.ibm.wsspi.security. auth.callback.Constants.WSPRINCIPAL_KEY); credential = (WSCredential) _sharedState.get(com.ibm.wsspi.security. auth.callback.Constants.WSCREDENTIAL_KEY); defaultAuthzToken = (AuthorizationToken) _sharedState.get(com.ibm. wsspi.security.auth.callback.Constants.WSAUTHZTOKEN_KEY); // O que você pretende fazer com essas informações depende do cenário // que está tentando alcançar. Este exemplo demonstra como // acessar as várias informações diferentes: // - Determinar se um login é inicial versus propagação // - Desserializar um token de autorização customizado (Para obter mais informações, consulte // Propagação de Atributo de Segurança // - Incluir um novo token de autorização customizado (Para obter mais informações, consulte // Propagação de Atributo de Segurança // - Procurar um WSCredential e ler atributos, se localizados. // - Procurar um WSPrincipal e ler atributos, se localizados. // - Procurar um AuthorizationToken padrão e incluir atributos, se localizados. // - Ler os atributos de cabeçalho do HttpServletRequest, se localizados. // - Incluir um atributo em HttpServletResponse, se localizado // - Obter o nome do aplicativo da Web a partir do appContext, se localizado. // - Determina se um login é inicial versus propagação. Isso é muito // útil quando o módulo de login é o primeiro. boolean requiresLogin = ((WSTokenHolderCallback) callbacks[6]).requiresLogin(); // login inicial - realiza asserção de atributos de privilégio com base na identidade de usuário if (requiresLogin) { // Se estiver validando um símbolo de outro servidor, há uma // API (Interface de Programação de Aplicativo) para obter o uniqueID dele. if (credToken != null && uid == null) { try { String uniqueID = WSSecurityPropagationHelper. validateLTPAToken(credToken); String realm = WSSecurityPropagationHelper.getRealmFromUniqueID (uniqueID); // Agora defina-o como o UID para que você possa utiliza-lo para mapear ou // efetuar login. uid = WSSecurityPropagationHelper.getUserFromUniqueID (uniqueID); } catch (Exception e) { // manipular a exceção } } // Inclui uma Tabela Hash no estado compartilhado. // Nota: É possível executar o mapeamento customizado no valor NameCallback retornado // para alterar a identidade com base em suas próprias regras de mapeamento. uid = mapUser (uid); // Obtém o InitialContext padrão desse servidor. javax.naming.InitialContext ctx = new javax.naming.InitialContext(); // Obtém o objeto UserRegistry local. com.ibm.websphere.security.UserRegistry reg = (com.ibm.websphere.security. UserRegistry) ctx.lookup("UserRegistry"); // Obtém o uniqueID de registro do usuário com base no uid especificado em // NameCallback. String uniqueid = reg.getUniqueUserId(uid); uid = WSSecurityPropagationHelper.getUserFromUniqueID (uniqueID); // Obtém o nome de exibição do registro do usuário com base no uniqueID. String securityName = reg.getUserSecurityName(uid); // Obtém os grupos associados a esse uniqueID. java.util.List groupList = reg.getUniqueGroupIds(uid); // Cria o java.util.Hashtable com as informações reunidas do // UserRegistry. java.util.Hashtable hashtable = new java.util.Hashtable(); hashtable.put(com.ibm.wsspi.security.token.AttributeNameConstants. WSCREDENTIAL_UNIQUEID, uniqueid); hashtable.put(com.ibm.wsspi.security.token.AttributeNameConstants. WSCREDENTIAL_SECURITYNAME, securityName); hashtable.put(com.ibm.wsspi.security.token.AttributeNameConstants. WSCREDENTIAL_GROUPS, groupList); // Inclui uma chave de cache que é utilizada como parte do mecanismo de consulta do // para o Subject criado. A chave de cache pode ser um Objeto, mas deve // implementar o método toString(). Certifique-se de que cacheKey contém // informações suficientes para o escopo ao usuário e quaisquer atributos // adicionais utilizados. Se você não especificar essa propriedade o // O Subject será definido como escopo para o WSCREDENTIAL_UNIQUEID retornado, por padrão. hashtable.put(com.ibm.wsspi.security.token.AttributeNameConstants. WSCREDENTIAL_CACHE_KEY, "myCustomAttribute" + uniqueid); // Inclui a tabela hash no sharedState do Subject. _sharedState.put(com.ibm.wsspi.security.token.AttributeNameConstants. WSCREDENTIAL_PROPERTIES_KEY,hashtable); } // login de propagação - tokens propagados do processo else { // - Desserializa um símbolo de autorização customizado. Para obter informações adicionais, consulte // Propagação de Atributo de Segurança. // Isso pode ser feito no ponto de conexão do módulo de login (primeiro, // mediano ou último). if (authzTokenList != null) { // Itera através da lista procurando seu token customizado for (int i=0; i<authzTokenList.size(); i++) { TokenHolder tokenHolder = (TokenHolder)authzTokenList.get(i); // Procura o nome e a versão de sua implementação AuthorizationToken // personalizada if (tokenHolder.getName().equals("com.ibm.websphere.security.token. CustomAuthorizationTokenImpl") && tokenHolder.getVersion() == 1) { // Transmite os bytes para seu construtor AuthorizationToken customizado // para desserializar customAuthzToken = new com.ibm.websphere.security.token. CustomAuthorizationTokenImpl(tokenHolder.getBytes()); } } } // - Inclui um novo token de autorização customizado (Para obter mais informações, // consulte Propagação de Atributo de Segurança) // Isso pode ser feito no ponto de conexão do módulo de login (primeiro, mediano, // ou último). else { // Obtém o PROPRIETÁRIO do AuthenticationToken padrão. Ele deve // corresponder a todos os tokens. defaultAuthToken = (com.ibm.wsspi.security.token.AuthenticationToken) sharedState.get(com.ibm.wsspi.security.auth.callback.Constants. WSAUTHTOKEN_KEY); String principal = defaultAuthToken.getPrincipal(); // Inclui um novo token de autorização customizado. Esse é um login inicial. // Transmita o proprietário para o construtor customAuthzToken = new com.ibm.websphere.security.token. CustomAuthorizationTokenImpl(principal); // Inclui quaisquer atributos iniciais if (customAuthzToken != null) { customAuthzToken.addAttribute("key1", "value1"); customAuthzToken.addAttribute("key1", "value2"); customAuthzToken.addAttribute("key2", "value1"); customAuthzToken.addAttribute("key3", "something different"); } } } // - Procura um WSCredential e lê os atributos, se localizados. // Isso é mais útil quando conectado como o último módulo de login. if (credential != null) { try { // Lê alguns dados da credencial String securityName = credential.getSecurityName(); java.util.ArrayList = credential.getGroupIds(); } catch (Exception e) { // Handles exceptions throw new WSLoginFailedException (e.getMessage(), e); } } // - Procura um WSPrincipal e lê atributos, se localizados. // Isso é mais útil quando conectado como o último módulo de login. if (principal != null) { try { // Lê alguns dados do proprietário String principalName = principal.getName(); } catch (Exception e) { // Handles exceptions throw new WSLoginFailedException (e.getMessage(), e); } } // - Procura um AuthorizationToken padrão e inclui atributos, se localizados. // Isso é mais útil quando conectado como o último módulo de login. if (defaultAuthzToken != null) { try { // Lê alguns dados de defaultAuthzToken String[] myCustomValue = defaultAuthzToken.getAttributes ("myKey"); // Inclui alguns dados se não estiverem presentes no defaultAuthzToken if (myCustomValue == null) defaultAuthzToken.addAttribute ("myKey", "myCustomData"); } catch (Exception e) { // Handles exceptions throw new WSLoginFailedException (e.getMessage(), e); } } // - Lê os atributos de cabeçalho do HttpServletRequest, se localizados. // Isso pode ser feito no ponto de conexão do módulo de login (primeiro, mediano, // ou último). if (request != null) { java.util.Enumeration headerEnum = request.getHeaders(); while (headerEnum.hasMoreElements()) { System.out.println ("Header element: " + (String)headerEnum.nextElement()); } } // - Inclui um atributo em HttpServletResponse, se localizado // Isso pode ser feito no ponto de conexão do módulo de login (primeiro, mediano, // ou último). if (response != null) { response.addHeader ("myKey", "myValue"); } // - Obtém o nome do aplicativo da Web a partir do appContext, se localizado. // Isso pode ser feito no ponto de conexão do módulo de login (primeiro, mediano, // ou último). if (appContext != null) { String appName = (String) appContext.get(com.ibm.wsspi.security.auth. callback.Constants.WEB_APP_NAME); } return succeeded; } public boolean commit() throws LoginException { boolean succeeded = true; // Inclua quaisquer objetos aqui, criados e pertencentes ao // Subject válido. Certifique-se de que os objetos ainda não estão incluídos. Se você incluiu // qualquer variável sharedState, remova-as antes de sair. Se o método abort() // for chamado, certifique-se de limpar tudo que foi incluído no // Subject here. if (customAuthzToken != null) { // Define o token customAuthzToken no Subject try { // Faça isso em um bloco de códigos doPrivileged para que o código do aplicativo // não precise incluir permissões adicionais java.security.AccessController.doPrivileged(new java.security.PrivilegedAction() { public Object run() { try { // Inclui o token de autorização customizado se ele não for // nulo e ainda não estiver no Subject if ((customAuthzTokenPriv != null) && (!_subject.getPrivateCredentials().contains(customAuthzTokenPriv))) { _subject.getPrivateCredentials().add(customAuthzTokenPriv); } } catch (Exception e) { throw new WSLoginFailedException (e.getMessage(), e); } return null; } }); } catch (Exception e) { throw new WSLoginFailedException (e.getMessage(), e); } } return succeeded; } public boolean abort() throws LoginException { boolean succeeded = true; // Certifique-se de remover todos os objetos que já tenham sido incluídos (tanto no // Subject quanto no estado compartilhado). if (customAuthzToken != null) { // remova o token customAuthzToken do Subject try { final AuthorizationToken customAuthzTokenPriv = customAuthzToken; // Faça isso em um bloco doPrivileged para que o código do aplicativo não precise // incluir permissões adicionais java.security.AccessController.doPrivileged(new java.security.PrivilegedAction() { public Object run() { try { // Remove o token de autorização customizado se ele não for // nulo e ainda não estiver no Subject if ((customAuthzTokenPriv != null) && (_subject.getPrivateCredentials(). contains(customAuthzTokenPriv))) { _subject.getPrivateCredentials(). remove(customAuthzTokenPriv); } } catch (Exception e) { throw new WSLoginFailedException (e.getMessage(), e); } return null; } }); } catch (Exception e) { throw new WSLoginFailedException (e.getMessage(), e); } } return succeeded; } public boolean logout() throws LoginException { boolean succeeded = true; // Assegura a remoção de todos os objetos que já tenham sido incluídos // (no Subject e no estado compartilhado). if (customAuthzToken != null) { // Remove o token customAuthzToken do Subject try { final AuthorizationToken customAuthzTokenPriv = customAuthzToken; // Faça isso em um bloco de códigos doPrivileged para que o código do aplicativo // não precise incluir permissões adicionais java.security.AccessController.doPrivileged(new java.security. PrivilegedAction() { public Object run() { try { // Remove o token de autorização customizado se ele não for nulo e já // estiver no Subject if ((customAuthzTokenPriv != null) && (_subject. getPrivateCredentials(). contains(customAuthzTokenPriv))) { _subject.getPrivateCredentials().remove(customAuthzTokenPriv); } } catch (Exception e) { throw new WSLoginFailedException (e.getMessage(), e); } return null; } }); } catch (Exception e) { throw new WSLoginFailedException (e.getMessage(), e); } } return succeeded; } }
- Configure o login do sistema para seu módulo de login customizado.
Após desenvolver seu módulo de login customizado para uma configuração de login do sistema, você pode configurar o login do sistema utilizando o console administrativo ou o utilitário wsadmin. Para configurar o login do sistema utilizando o console administrativo, clique em Segurança > Segurança Global. Em Java Authentication and Authorization Service, clique em Logins do sistema. Para obter informações adicionais sobre o uso do utilitário wsadmin para configuração de login do sistema,consulte Customizando uma autenticação do Java Authentication and Authorization Service e a configuração de login do lado do servidor. Além disso, consulte esse artigo para obter informações sobre os módulos de login do sistema e para determinar se você vai incluir módulos de login adicionais.
Subtópicos
Customizando o Login de Aplicativo com o Java Authentication and Authorization Service
Utilizando o JAAS (Java Authentication and Authorization Service), você pode customizar seu login de aplicativo.


http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tsec_jaascustlogmod
Nome do arquivo: tsec_jaascustlogmod.html