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:
- Em um programa cliente
- Em um programa servidor
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:
- 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("");
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.
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
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 WebSphere Application Server e configure a seguinte propriedade:
no Console Administrativo docom.ibm.websphere.security.registry.propagateExceptionsToClient=true
Login Programático sem Prompt
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).
Login Programático com Prompt de Interface com o Usuário
![[z/OS]](../images/ngzos.gif)
![[AIX HP-UX Solaris]](../images/unix.gif)
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
}
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.
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
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
}