Login Programático para JAAS

Login programático é um tipo de login de formulário que suporta formulários de login específicos do site de apresentação de aplicativo com a finalidade de autenticação.

Quando aplicativos clientes de beans corporativos exigem que o usuário forneça informações de identificação, o criador do aplicativo deve coletar essas informações e autenticar o usuário. O trabalho do programador pode ser amplamente classificado em termos de onde a autenticação do usuário ocorre:

Os usuários de aplicativos da Web podem receber solicitações de dados de autenticação de muitas maneiras. O elemento <login-config> no arquivo do descritor de implementação de aplicativos da Web define o mecanismo que é usado para coletar estas informações. Os programadores que desejam personalizar os procedimentos de login, em vez de depender de dispositivos de uso geral, como uma janela de diálogo 401 em um navegador, podem utilizar um formulário baseado no login para fornecer um formulário HTML específico do aplicativo para coletar as informações de login.

Nenhuma autenticação ocorrerá a menos que a segurança administrativa esteja ativada. Se desejar usar o login com base em formulário para aplicativos da Web, será necessário especificar FORM na tag auth-method do elemento <login-config> no descritor de implementação de cada aplicativo da Web.

Os aplicativos podem apresentar formulários de login específicos do site usando o tipo de login de formulário do WebSphere Application Server. A especificação Java™ Platform, Enterprise Edition (Java EE) define o login de formulário como um dos métodos de autenticação para aplicativos da Web. O WebSphere Application Server fornece um mecanismo de logout de formulário.

Login Programático do Java Authentication and Authorization Service

O Java Authentication and Authorization Service (JAAS) é um novo recurso no WebSphere Application Server. Ele também é imposto pela Especificação Java EE 1.4. O JAAS é uma coleta de APIs (Interfaces de Programação de Aplicativos) estratégias que substituem as APIs de login programático do CORBA (Common Object Request Broker Architecture). WebSphere Application Server fornece algumas extensões para JAAS:

Antes de começar a desenvolver com APIs de login programático, considere os seguintes pontos:
  • Para o aplicativo cliente Java puro ou o aplicativo contêiner do cliente, inicialize a segurança ORB (Object Request Broker) do cliente antes de executar um login do JAAS. Faça isso executando o seguinte código antes do login do JAAS:
    ...
    import java.util.Hashtable;
    import javax.naming.Context;
    import javax.naming.InitialContext;
    ...
    // Execute um InitialContext e consulte o padrão antes de efetuar login 
    // para inicializar a segurança ORB e para o host/porta de auto-inicialização 
    // ser determinado para consulta de SecurityServer. Se você não quiser 
    // validar o ID de usuário/senha durante o login do JAAS, desative a 
    // propriedade com.ibm.CORBA.validateBasicAuth no 
    // arquivo sas.client.props.
    
    Hashtable env = new Hashtable();
    env.put(Context.INITIAL_CONTEXT_FACTORY, 
        "com.ibm.websphere.naming.WsnInitialContextFactory");
    env.put(Context.PROVIDER_URL, 
         "corbaloc:iiop:myhost.mycompany.com:2809");
    Context initialContext = new InitialContext(env);
    Object obj = initialContext.lookup("");
    [z/OS]Nota: Configure com.ibm.CORBA.validateBasicAuth=false sempre que conectar-se a um servidor z/OS. Esta função não funciona atualmente a partir de um cliente distribuído para um servidor z/OS, uma vez que o SecurityServer é localizado utilizando-se o proprietário "UNAUTHENTICATED", que não é aceito em um sistema z/OS.
  • Para o aplicativo cliente Java puro ou o aplicativo contêiner do cliente, certifique-se de que o nome do host e o número da porta das propriedades de auto-inicialização da JNDI (Java Naming and Directory Interface) de destino estejam especificados corretamente. Consulte a seção Desenvolvendo Aplicativos que Utilizam CosNaming (Interface de Nomes de CORBA) para obter detalhes.
  • Se o aplicativo utiliza configuração de login do JAAS personalizada, certifique-se de que essa configuração esteja definida corretamente. Consulte a seção Configurando os logins programáticos para o JAAS (Java Authentication and Authorization Service) para obter detalhes.
  • Algumas das APIs do JAAS são protegidas por permissões de segurança Java 2. Se essas APIs forem utilizadas pelo código do aplicativo, assegure que essas permissões sejam adicionadas ao arquivo was.policy do aplicativo. Consulte as seções Incluindo o Arquivo was.policy em Aplicativos para Segurança Java 2, Usando PolicyTool para Editar Arquivos de Políticas para Segurança Java 2 e Configurando o Arquivo was.policy para Segurança Java 2 para obter detalhes. Para obter mais detalhes de quais APIs são protegidas pelas permissões de segurança do Java 2, consulte a documentação de APIs públicas do IBM® Developer Kit, Java Technology Edition; JAAS e do WebSphere Application Server. A lista a seguir contém as APIs utilizadas no código das amostras fornecido nesta documentação.
    • Construtores javax.security.auth.login.LoginContext são protegidos por "createLoginContext" de javax.security.auth.AuthPermission.
    • javax.security.auth.Subject.doAs e com.ibm.websphere.security.auth.WSSubject.doAs são protegidos por javax.security.auth.AuthPermission "doAs".
    • javax.security.auth.Subject.doAsPrivileged e com.ibm.websphere.security.auth.WSSubject.doAsPrivileged são protegidos por javax.security.auth.AuthPermission "doAsPrivileged".
  • com.ibm.websphere.security.auth.WSSubject: Devido a um equívoco no design no JAAS Versão 1.0, javax.security.auth.Subject.getSubject não retorna o Subject associado ao encadeamento em execução dentro de um bloco de código java.security.AccessController.doPrivileged. Isso pode apresentar um comportamento inconsistente que é problemático e provoca esforço indesejável. A API com.ibm.websphere.security.auth.WSSubject fornece uma solução alternativa para associar o Subject ao encadeamento em execução. A API com.ibm.websphere.security.auth.WSSubject estende o modelo JAAS aos recursos Java EE para verificações de autorização. O Subject associado ao encadeamento em execução no bloco de código com.ibm.websphere.security.auth.WSSubject.doAs ou com.ibm.websphere.security.auth.WSSubject.doAsPrivileged é utilizado para verificações de autorização de recursos Java EE.
  • Suporte do console administrativo para definir nova configuração de login JAAS: é possível definir a configuração de login JAAS no console administrativo e armazená-la na API de configuração do WebSphere Application Server. Os aplicativos podem definir nova configuração de login JAAS no console administrativo e os dados são persistidos no repositório de configuração que é armazenado com a API de configuração do WebSphere Application Server. Entretanto, o WebSphere Application Server ainda suporta o formato de configuração de login JAAS padrão que é fornecido pela implementação padrão JAAS. Se configurações de login duplicado forem definidas na API de configuração do WebSphere Application Server e no formato do arquivo simples, a configuração de login na API de configuração do WebSphere Application Server tem precedência. As vantagens para definir a configuração de login na API de configuração do WebSphere Application Server incluem:
    • Definição da configuração de login do JAAS utilizando o console administrativo.
    • Gerenciamento central da configuração de login do JAAS.
    • Distribuição da configuração de login JAAS em uma instalação do WebSphere Application Server, Network Deployment.
  • As configurações de login JAAS para o WebSphere Application Server: o WebSphere Application Server fornece configurações de login JAAS para aplicativos para executar a autenticação programática no tempo de execução de segurança do WebSphere Application Server. Essas configurações de login JAAS para o WebSphere Application Server executam autenticação para o mecanismo de autenticação configurado, Simple WebSphere Authentication Mechanism (SWAM) ou Lightweight Third-Party Authentication (LTPA), e o registro do usuário (S.O Local, LDAP ou Customizado) com base nos dados de autenticação fornecidos. O Assunto autenticado dessas configurações de login JAAS contêm o proprietário e as credenciais necessárias que podem ser usadas pelo tempo de execução de segurança do WebSphere Application Server para executar verificações de autorização nos recursos protegidos com base em função do Java EE.
    Nota: SWAM foi descontinuado no WebSphere Application Server Versão 9.0 e será removido em um release futuro.
    Estas são as configurações de login JAAS fornecidas pelo WebSphere Application Server:
    • Configuração de login JAAS WSLogin: Uma configuração de login JAAS genérica que um cliente Java, aplicativo de contêiner do cliente, servlet, arquivo JSP, enterprise bean etc, pode usar para executar autenticação com base em um ID de usuário e senha ou um token para o tempo de execução de segurança do WebSphere Application Server. No entanto, esta configuração não suporta a rotina de tratamento CallbackHandler especificada no descritor de implementação do contêiner do cliente.
    • Configuração de login do JAAS ClientContainer: Esta configuração de login do JAAS reconhece o manipulador CallbackHandler que é especificado no descritor de implementação do contêiner do cliente. O módulo de login desta configuração de login utiliza a rotina de tratamento CallbackHandler no descritor de implementação do contêiner do cliente, se for especificada uma, mesmo que o código do aplicativo tenha especificado uma rotina de tratamento CallbackHandler no contexto de login. Isto é para aplicativo de contêiner de cliente.
    • Os Subjects autenticados com as configurações de login do JAAS mencionadas anteriormente contêm um proprietário com.ibm.websphere.security.auth.WSPrincipal e uma credencial com.ibm.websphere.security.auth.WSCredential. Se o Assunto autenticado for passado para o método com.ibm.websphere.security.auth.WSSubject.doAs ou os outros métodos doAs, o tempo de execução de segurança do WebSphere Application Server pode executar verificações de autorização nos recursos do Java EE, com base na credencial com.ibm.websphere.security.auth.WSCredential do Assunto.
  • Configurações de login do JAAS definidas pelo cliente: É possível definir outras configurações de login do JAAS. Veja detalhes em Configurando os logins programáticos para o JAAS (Java Authentication and Authorization Service). Utilize essas configurações de login para executar autenticação programática para o mecanismo de autenticação personalizado. Entretanto, os assuntos dessas configurações de login JAAS definidas pelo cliente poderão não ser usadas pelo tempo de execução de segurança do WebSphere Application Server para executar verificações de autorização se o assunto não contiver o proprietário e credenciais necessárias.

Localizar a Raiz Causa Exceção de Login a partir de um Login JAAS

Se você obtiver uma exceção LoginException após emitir a API LoginContext.login, poderá localizar a exceção da causa raiz a partir do registro do usuário configurado. Nos módulos de login, as exceções do registro são agrupadas por uma classe com.ibm.websphere.security.auth.WSLoginFailedException. Esta exceção possui um método getCause com o qual é possível extrair a exceção que foi agrupada após a emissão do comando anterior.

Nem sempre é garantida a obtenção de uma exceção WSLoginFailedException, mas a maioria das exceções geradas no registro do usuário são exibidas aqui. O exemplo a seguir ilustra uma API LoginContext.login com o bloco de captura associado. Converta a exceção WSLoginFailedException na classe com.ibm.websphere.security.auth.WSLoginFailedException, se desejar emitir a API getCause.

O exemplo determineCause a seguir pode ser utilizado para processar tipos de exceções CustomUserRegistry.
try 
    {
         lc.login(); 
    } 
    catch (LoginException le)
    {
	// aprofundar-se nas exceções já que elas podem estar em cascata pelo tempo de execução
	Throwable root_exception = determineCause(le);
	
	// agora você pode utilizar "root_exception" para comparar com um determinado tipo de exceção
	// por exemplo, se tiver implementado um tipo CustomUserRegistry, 
  //  você saberá o que procurar aqui.
    }


/* Método usado para aprofundar-se em WSLoginFailedException para localizar a 
exceção da "causa raiz" */

    public Throwable determineCause(Throwable e) 
      {
				Throwable root_exception = e, temp_exception = null;

				// manter o loop até que não haja mais exceções WSLoginFailedException ou 
				// WSSecurityException exceptions 
         while (true) 
				{
						if (e instanceof com.ibm.websphere.security.auth.WSLoginFailedException)
						{
							temp_exception = ((com.ibm.websphere.security.auth.WSLoginFailedException)
							e).getCause();
						}
						else if (e instanceof com.ibm.websphere.security.WSSecurityException)
						{
							temp_exception = ((com.ibm.websphere.security.WSSecurityException)
							e).getCause();
						}
						else if (e instanceof javax.naming.NamingException)
								// verificar exceção incorporada do Ldap
								{
										temp_exception = ((javax.naming.NamingException)e).getRootCause();
								}
						else if (e instanceof your_custom_exception_here)
						{
								// seu processamento personalizado aqui, se necessário
						}
						else
						{
								// esta exceção não é de um dos tipos que estamos procurando,
								// vamos retornar agora, esta é a raiz pela perspectiva do WebSphere 
								//  Application Server
								return root_exception;
						}
						if (temp_exception != null)
						{
								// temos uma exceção; volte e veja se ela possui outra
								//  incorporada nela.
								root_exception = temp_exception;
								e = temp_exception;
								continue;
						}
						else
						{
								// finalmente temos a exceção raiz deste caminho de chamada,
								// isso deve ocorrer em algum ponto
								return root_exception;
						}
				}
		}

Localizar a Raiz Causa Exceção de Login a partir de um Filtro de Servlet

Você também pode receber a exceção da causa raiz de um filtro de servlet ao abordar o processamento de login pós-formulário. Esta exceção é útil porque mostra ao usuário o que aconteceu. Você pode emitir a seguinte API para obter a exceção da causa raiz:
Throwable t = com.ibm.websphere.security.auth.WSSubject.getRootLoginException();  
if (t != null)  	
         t = determineCause(t);

Quando você tiver a exceção, poderá executá-la por meio do exemplo de determineCause acima para obter a causa raiz do registro nativo.

Ativando a Propagação de Exceção de Login de Causa Raiz para Clientes Java Puros

Atualmente, a causa raiz não é propagada a um cliente puro por motivos de segurança. Contudo, você pode querer propagar a causa raiz para um cliente puro em um ambiente confiável. Se desejar ativar a propagação de exceção de login de causa-raiz para um cliente puro, clique em Segurança > Segurança Global > Propriedades Customizadas no Console Administrativo do WebSphere Application Server e configure a seguinte propriedade:

com.ibm.websphere.security.registry.propagateExceptionsToClient=true

Login Programático sem Prompt

O WebSphere Application Server fornece uma implementação não prompt da interface javax.security.auth.callback.CallbackHandler, que é chamada de com.ibm.websphere.security.auth.callback.WSCallbackHandlerImpl. Utilizando essa interface, um aplicativo pode enviar dados de autenticação para a instância LoginModule do WebSphere para executar autenticação. Esse recurso é útil ao código do aplicativo no lado do servidor para autenticar uma identidade e utilizá-la para chamar recursos Java EE de recebimento de dados.
javax.security.auth.login.LoginContext lc = null;

try {
lc = new javax.security.auth.login.LoginContext("WSLogin",
new com.ibm.websphere.security.auth.callback.WSCallbackHandlerImpl("user", 
      "securityrealm", "securedpassword"));

// crie um LoginContext e especifique uma implementação CallbackHandler
// A implementação CallbackHandler determina como os dados de autenticação são coletados
// neste caso, os dados de autenticação são "empurrados" para o mecanismo de autenticação
//   implementado pelo LoginModule.
} catch (javax.security.auth.login.LoginException e) {
System.err.println("ERROR: failed to instantiate a LoginContext and the exception: " 
+ e.getMessage());
e.printStackTrace();

// talvez javax.security.auth.AuthPermission "createLoginContext" não tenha sido concedido
// ao aplicativo, ou a configuração de login do JAAS não está definida.
}

if (lc != null)
try {
lc.login();  // efetuar login
javax.security.auth.Subject s = lc.getSubject();
// obtenha o elemento autenticado

// Chame um recurso Java EE utilizando o elemento autenticado
com.ibm.websphere.security.auth.WSSubject.doAs(s,
new java.security.PrivilegedAction() {
public Object run() {
try {
bankAccount.deposit(100.00);  // em que bankAccount é um EJB protegido
} catch (Exception e) {
System.out.println("ERROR: error while accessing EJB resource, exception: " 
+ e.getMessage());
e.printStackTrace();
}
return null;
}
}
);
} catch (javax.security.auth.login.LoginException e) {
System.err.println("ERROR: login failed with exception: " + e.getMessage());
e.printStackTrace();

// falha de login, pode ser necessário fornecer lógica de relogin
}

É possível utilizar o manipulador de retorno de chamada com.ibm.websphere.security.auth.callback.WSCallbackHandlerImpl com um cliente Java puro, um contêiner de aplicativo cliente, um enterprise bean, arquivos JSP (JavaServer Pages), servlet ou outros recursos Java 2 Platform, Enterprise Edition (Java EE).

Nota: O manipulador de retorno de chamada WSCallbackHandlerImpl será diferente, dependendo se você usar a segurança do WebSphere Application Server ou o Web Services Security. Ele está localizado no arquivo sas.jar para segurança e no arquivo was-wssecurity.jar para Web Services Security.

Login Programático com Prompt de Interface com o Usuário

O WebSphere Application Server também fornece uma implementação de interface com o usuário da implementação javax.security.auth.callback.CallbackHandler para coletar dados de autenticação de um usuário por meio de prompts de login da interface com o usuário. O manipulador de retorno de chamada com.ibm.websphere.security.auth.callback.WSGUICallbackHandlerImpl apresenta um painel de login da interface com o usuário para solicitar dados de autenticação do usuário.
[z/OS][AIX HP-UX Solaris]Nota: Esse comportamento requer que um servidor X11 seja chamado pelo ambiente DISPLAY.
javax.security.auth.login.LoginContext lc = null;

try {
lc = new javax.security.auth.login.LoginContext("WSLogin",
new com.ibm.websphere.security.auth.callback.WSGUICallbackHandlerImpl());

// crie um LoginContext e especifique uma implementação CallbackHandler
// A implementação CallbackHandler determina como os dados de autenticação são coletados
// nesse caso, a data de autenticação é coletada pelo prompt de login da GUI
//   e transmitida ao mecanismo de autenticação implementado pelo LoginModule.
} catch (javax.security.auth.login.LoginException e) {
System.err.println("ERROR: failed to instantiate a LoginContext and the exception: " 
+ e.getMessage());
e.printStackTrace();

// talvez javax.security.auth.AuthPermission "createLoginContext" não tenha sido concedido
// ao aplicativo, ou a configuração de login do JAAS não está definida.
}

if (lc != null)
try {
lc.login();  // efetuar login
javax.security.auth.Subject s = lc.getSubject();
// obtenha o elemento autenticado

// Chame um recurso Java EE utilizando o elemento autenticado
com.ibm.websphere.security.auth.WSSubject.doAs(s,
new java.security.PrivilegedAction() {
public Object run() {
try {
bankAccount.deposit(100.00);  // em que bankAccount é um bean corporativo protegido
} catch (Exception e) {
System.out.println("ERROR: error while accessing EJB resource, exception: " 
+ e.getMessage());
e.printStackTrace();
}
return null;
}
}
);
} catch (javax.security.auth.login.LoginException e) {
System.err.println("ERROR: login failed with exception: " + e.getMessage());
e.printStackTrace();

// falha de login, pode ser necessário fornecer lógica de relogin
}
Atenção: Não utilize a rotina de tratamento de retorno de chamada com.ibm.websphere.security.auth.callback.WSGUICallbackHandlerImpl para recursos do lado do servidor, como enterprise bean, servlet, arquivos JSP e outros. O prompt de login da interface com o usuário bloqueia o servidor para entrada pelo usuário. Este comportamento não é recomendável para um processo de servidor.

O WebSphere Application Server também fornece uma implementação de cache de credencial Kerberos da interface javax.security.auth.callback.CallbackHandler. O manipulador de retorno de chamada, com.ibm.websphere.security.auth.callback.WSCcacheCallBackHandlerImpl. Utilizando essa interface, um aplicativo pode enviar dados de autenticação para a instância LoginModule do WebSphere para executar autenticação.

Esse recurso está disponível apenas para o código do aplicativo do lado do cliente para autenticação no WebSphere Application Server com o cache de credenciais Kerberos.

Se as seguintes opções existirem no arquivo wsjaas_client.conf, defina-as como false:

   useDefaultKeytab=false
   useDefaultCcache=false
   tryFirstPass=false
   useFirstPass=false
   forwardable=false
   renewable=false
   renewable=false
   noaddress=false

javax.security.auth.login.LoginContext lc = null;

String krb5Ccache = /etc/krb5/krb5cc_utle;

try {
lc = new javax.security.auth.login.LoginContext("WSKRB5Login",
new com.ibm.websphere.security.auth.callback.WSCcacheCallBackHandlerImpl(user, krb5Realm, krb5Ccache, false));
// crie um LoginContext e especifique uma implementação CallbackHandler
// A implementação de CallbackHandler determina como os dados de autenticação são coletados
// neste caso, os dados de autenticação são coletados por prompt de stdin
// e transmitidos para o mecanismo de autenticação implementado pelo LoginModule.
} catch (javax.security.auth.login.LoginException e) {
System.err.println("ERROR: failed to instantiate a LoginContext and the exception: 
          " + e.getMessage());
e.printStackTrace();

// talvez javax.security.auth.AuthPermission "createLoginContext" não tenha sido concedido
// ao aplicativo, ou a configuração de login do JAAS não está definida.
}

if (lc != null)
try {
lc.login();  // efetuar login
javax.security.auth.Subject s = lc.getSubject();
// obtenha o elemento autenticado

// Chame um recurso Java EE utilizando o elemento autenticado
com.ibm.websphere.security.auth.WSSubject.doAs(s,
new java.security.PrivilegedAction() {
public Object run() {
try {
bankAccount.deposit(100.00);  
// em que bankAccount é um bean corporativo protegido
} catch (Exception e) {
System.out.println("ERROR: error while accessing EJB resource, exception: " 
       + e.getMessage());
e.printStackTrace();
}
return null;
}
}
);
} catch (javax.security.auth.login.LoginException e) {
System.err.println("ERROR: login failed with exception: " + e.getMessage());
e.printStackTrace();

// falha de login, pode ser necessário fornecer lógica de relogin
}

Servidor de Aplicativos com o cache de credenciais Kerberos padrão.

javax.security.auth.login.LoginContext lc = null;

try {
lc = new javax.security.auth.login.LoginContext("WSKRB5Login",
new com.ibm.websphere.security.auth.callback.WSCcacheCallBackHandlerImpl(user, krb5Realm, null, true));
// crie um LoginContext e especifique uma implementação CallbackHandler
// A implementação de CallbackHandler determina como os dados de autenticação são coletados
// neste caso, os dados de autenticação são coletados por prompt de stdin
// e transmitidos para o mecanismo de autenticação implementado pelo LoginModule.
} catch (javax.security.auth.login.LoginException e) {
System.err.println("ERROR: failed to instantiate a LoginContext and the exception: 
          " + e.getMessage());
e.printStackTrace();

// talvez javax.security.auth.AuthPermission "createLoginContext" não tenha sido concedido
// ao aplicativo, ou a configuração de login do JAAS não está definida.
}

if (lc != null)
try {
lc.login();  // efetuar login
javax.security.auth.Subject s = lc.getSubject();
// obtenha o elemento autenticado

// Chame um recurso Java EE utilizando o elemento autenticado
com.ibm.websphere.security.auth.WSSubject.doAs(s,
new java.security.PrivilegedAction() {
public Object run() {
try {
bankAccount.deposit(100.00);  
// em que bankAccount é um bean corporativo protegido
} catch (Exception e) {
System.out.println("ERROR: error while accessing EJB resource, exception: " 
       + e.getMessage());
e.printStackTrace();
}
return null;
}
}
);
} catch (javax.security.auth.login.LoginException e) {
System.err.println("ERROR: login failed with exception: " + e.getMessage());
e.printStackTrace();

// falha de login, pode ser necessário fornecer lógica de relogin
}

Servidor de Aplicativos com o cache de credenciais Kerberos nativo da Microsoft. O cliente deve
efetuar login no Microsoft Domain Controller.

javax.security.auth.login.LoginContext lc = null;

try {
lc = new javax.security.auth.login.LoginContext("WSKRB5Login",
new com.ibm.websphere.security.auth.callback.WSCcacheCallBackHandlerImpl(null, null, null, true));
// crie um LoginContext e especifique uma implementação CallbackHandler
// A implementação de CallbackHandler determina como os dados de autenticação são coletados
// neste caso, os dados de autenticação são coletados por prompt de stdin
// e transmitidos para o mecanismo de autenticação implementado pelo LoginModule.
} catch (javax.security.auth.login.LoginException e) {
System.err.println("ERROR: failed to instantiate a LoginContext and the exception: 
          " + e.getMessage());
e.printStackTrace();

// talvez javax.security.auth.AuthPermission "createLoginContext" não tenha sido concedido
// ao aplicativo, ou a configuração de login do JAAS não está definida.
}

if (lc != null)
try {
lc.login();  // efetuar login
javax.security.auth.Subject s = lc.getSubject();
// obtenha o elemento autenticado

// Chame um recurso Java EE utilizando o elemento autenticado
com.ibm.websphere.security.auth.WSSubject.doAs(s,
new java.security.PrivilegedAction() {
public Object run() {
try {
bankAccount.deposit(100.00);  
// em que bankAccount é um bean corporativo protegido
} catch (Exception e) {
System.out.println("ERROR: error while accessing EJB resource, exception: " 
       + e.getMessage());
e.printStackTrace();
}
return null;
}
}
);
} catch (javax.security.auth.login.LoginException e) {
System.err.println("ERROR: login failed with exception: " + e.getMessage());
e.printStackTrace();

// falha de login, pode ser necessário fornecer lógica de relogin
}

Módulo WSKRB5Login

A configuração de login JAAS WSKRB5Login: é uma configuração de login JAAS genérica que um cliente Java, aplicativo de contêiner do cliente, servlet, arquivo JSP ou enterprise bean pode usar para executar autenticação com base em uma senha de nome de proprietário Kerberos ou um cache de credenciais Kerberos no tempo de execução de segurança do WebSphere Application Server. No entanto, esta configuração não suporta a rotina de tratamento CallbackHandler especificada no descritor de implementação do contêiner do cliente.

Coloque os arquivos krb5.ini ou krb5.conf que você criou em um local padrão. Se o arquivo não estiver no local padrão, você deverá definir a propriedade de sistema da JVM java.security.krb5.conf com o caminho correto e o nome do arquivo de configuração do Kerberos.

Em uma plataforma Windows®, o local padrão é c:\winnt\krb5.ini.

Em uma plataforma Linux®, o local padrão é /etc/krb5.conf.

Nas demais plataformas Unix, o local padrão é /etc/krb5/krb5.conf.

Em uma plataforma z/OS, o local padrão é /etc/krb5/krb5.conf.

As definições de configuração do Kerberos, o nome do centro de distribuição de chaves (KDC) Kerberos e as configurações de região são fornecidos no arquivo de configuração do Kerberos ou nos arquivos da propriedade de sistema java.security.krb5.kdc and java.security.krb5.realm.

Login Programático com Prompt de Stdin

O WebSphere Application Server também fornece uma implementação stdin da interface javax.security.auth.callback.CallbackHandler. A rotina de tratamento de retorno de chamada, com.ibm.websphere.security.auth.callback.WSStdinCallbackHandlerImpl, solicita e coleta dados de autenticação de um usuário por meio do prompt de stdin.
javax.security.auth.login.LoginContext lc = null;

try {
lc = new javax.security.auth.login.LoginContext("WSLogin",
new com.ibm.websphere.security.auth.callback.WSStdinCallbackHandlerImpl());

// crie um LoginContext e especifique uma implementação CallbackHandler
// A implementação de CallbackHandler determina como os dados de autenticação são coletados
// neste caso, os dados de autenticação são coletados por prompt de stdin
// e transmitidos para o mecanismo de autenticação implementado pelo LoginModule.
} catch (javax.security.auth.login.LoginException e) {
System.err.println("ERROR: failed to instantiate a LoginContext and the exception: 
          " + e.getMessage());
e.printStackTrace();

// talvez javax.security.auth.AuthPermission "createLoginContext" não tenha sido concedido
// ao aplicativo, ou a configuração de login do JAAS não está definida.
}

if (lc != null)
try {
lc.login();  // efetuar login
javax.security.auth.Subject s = lc.getSubject();
// obtenha o elemento autenticado

// Chame um recurso Java EE utilizando o elemento autenticado
com.ibm.websphere.security.auth.WSSubject.doAs(s,
new java.security.PrivilegedAction() {
public Object run() {
try {
bankAccount.deposit(100.00);  
// em que bankAccount é um bean corporativo protegido
} catch (Exception e) {
System.out.println("ERROR: error while accessing EJB resource, exception: " 
       + e.getMessage());
e.printStackTrace();
}
return null;
}
}
);
} catch (javax.security.auth.login.LoginException e) {
System.err.println("ERROR: login failed with exception: " + e.getMessage());
e.printStackTrace();

// falha de login, pode ser necessário fornecer lógica de relogin
}
Atenção: Não utilize a rotina de tratamento de retorno de chamada com.ibm.websphere.security.auth.callback.WSStdinCallbackHandlerImpl para recursos do lado do servidor, como beans corporativos, servlets, arquivos JSP e outros. A entrada do prompt stdin não é enviada para o ambiente do servidor. A maioria dos servidores é executada no segundo plano e não tem um console. No entanto, se o servidor tiver um console, o prompt de stdin bloqueará o servidor para entrada pelo usuário. Este comportamento não é recomendável para um processo de servidor.

Ícone que indica o tipo de tópico Tópico de Conceito



Ícone de registro de data e hora Última atualização: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=csec_programlog
Nome do arquivo: csec_programlog.html