Tutorial de JAAS  XML
Índice dos Fóruns » Desenvolvimento Web
Autor Mensagem
MandrackMago
Entusiasta Java

Membro desde: 05/03/2008 14:42:25
Mensagens: 20
Localização: Brasilia DF
Offline

Cgneo, ninguém respondeu a minha duvida, mas acredito que seja pelo mesmo motivo que tive que criar um grupo de roles chamado Roles conforme descrito

Jacaré que vacila vira bolsa de madame.
cgneo
HelloWorld

Membro desde: 23/08/2007 00:29:48
Mensagens: 10
Offline

Amigo,

fiz o que você falou mas mesmo assim deu erro 403.

Estou a seguir colocando a classe que implementei, esta cheio de log, pois estava analisando por onde passou. O engraçado que ele vai até o commit certinho.

Tem como você me enviar o seu código desta classe para comparar.

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.security.auth.Subject;
import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.NameCallback;
import javax.security.auth.callback.PasswordCallback;
import javax.security.auth.callback.UnsupportedCallbackException;
import javax.security.auth.login.LoginException;
import javax.security.auth.spi.LoginModule;
import javax.sql.DataSource;

public class GujLoginModule implements LoginModule {
private boolean commitSucceeded = false;
private boolean succeeded = false;

private User user;
private Set roles = new HashSet();

private GroupRole grupoRole = new GroupRole("abc");

protected Subject subject;
protected CallbackHandler callbackHandler;
protected Map sharedState;
private String dataSourceName;
private String sqlUser;
private String sqlRoles;

public void initialize(Subject subject, CallbackHandler callbackHandler, Map sharedState, Map options) {
System.err.println("1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" + callbackHandler);
this.subject = subject;
this.callbackHandler = callbackHandler;
this.sharedState = sharedState;
dataSourceName = (String) options.get("dataSourceName");
sqlUser = (String) options.get("sqlUser");
sqlRoles = (String) options.get("sqlRoles");
}

public boolean login() throws LoginException {
System.err.println("2xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
// recupera o login e senha informados no form
getUsernamePassword();

Connection conn = null;
try {
// obtem a conexão
try {
Context initContext = new InitialContext();
// Context envContext = (Context) initContext.lookup("java:/comp/env");
// DataSource ds = (DataSource) envContext.lookup(dataSourceName);

DataSource ds = (DataSource) initContext.lookup(dataSourceName);
conn = ds.getConnection();
} catch (NamingException e) {
System.err.println("2 NamingException");
succeeded = false;
throw new LoginException("Erro ao recuperar DataSource: " + e.getClass().getName() + ": " + e.getMessage());
} catch (SQLException e) {
System.err.println("2 SQLException");
succeeded = false;
throw new LoginException("Erro ao obter conexão: " + e.getClass().getName() + ": " + e.getMessage());
}
// valida o usuario
validaUsuario(conn);
} finally {
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
}
}
}
// acidiona o usuario e roles no mapa de compartilhamento
sharedState.put("javax.security.auth.principal", user);
sharedState.put("javax.security.auth.roles", roles);

return true;
}

public boolean commit() throws LoginException {
System.err.println("3xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
// adiciona o usuario no principals
if (user != null && !subject.getPrincipals().contains(user)) {

System.err.println("3 user = " + user );
subject.getPrincipals().add(user);
}
// adiciona as roles no principals
if (roles != null) {
Iterator it = roles.iterator();
while (it.hasNext()) {
Role role = (Role) it.next();
if (!subject.getPrincipals().contains(role)) {
System.err.println("Aqui 3 role = [" + role.getName()+"]" );
grupoRole.addMember(role);
}
}
System.err.println("3 adicionando grupoRole" + grupoRole);
subject.getPrincipals().add(grupoRole);
}

commitSucceeded = true;

System.err.println("3 commitSucceeded xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
return true;
}

public boolean abort() throws LoginException {
System.err.println("4xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
if (!succeeded) {
return false;
} else if (succeeded && !commitSucceeded) {
succeeded = false;
} else {
succeeded = false;
logout();
}

this.subject = null;
this.callbackHandler = null;
this.sharedState = null;
this.roles = new HashSet();

return succeeded;
}

public boolean logout() throws LoginException {
System.err.println("5xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
// remove o usuario e as roles do principals
subject.getPrincipals().removeAll(roles);
subject.getPrincipals().remove(user);
return true;
}

/**
* Valida login e senha no banco
*/
private void validaUsuario(Connection conn) throws LoginException {
System.err.println("6xxxxxxxxxxxxxxx loginInformado = "+ loginInformado);
String senhaBanco = null;
PreparedStatement statement = null;
ResultSet rs = null;
try {
statement = conn.prepareStatement(sqlUser);
statement.setString(1, loginInformado);
rs = statement.executeQuery();
if (rs.next()) {
senhaBanco = rs.getString(1);
} else {
succeeded = false;
System.err.println("Usuário não localizado.");
throw new LoginException("Usuário não localizado.");
}
} catch (SQLException e) {
succeeded = false;

System.err.println("Erro ao abrir sessão: "
+ e.getClass().getName() + ": " + e.getMessage());
throw new LoginException("Erro ao abrir sessão: "
+ e.getClass().getName() + ": " + e.getMessage());
} finally {
try {
if (rs != null)
rs.close();
if (statement != null)
statement.close();
} catch (Exception e) {

}
}

if (senhaInformado.equals(senhaBanco)) {
user = new User(loginInformado);
recuperaRoles(conn);
user.setRoles(roles);
return;
} else {
throw new LoginException("Senha Inválida.");
}
}

/**
* Recupera as roles no banco
*/
public void recuperaRoles(Connection conn) throws LoginException {
System.err.println("7xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
PreparedStatement statement = null;
ResultSet rs = null;
try {
statement = conn.prepareStatement(sqlRoles);
statement.setString(1, loginInformado);
rs = statement.executeQuery();
while (rs.next()) {
roles.add(new Role(rs.getString(1)));

System.err.println("7 rs.getString(1) = ["+rs.getString(1)+"]");
}

//roles.add(new Role("LOGADO"));
} catch (SQLException e) {
System.err.println("7 SQLException" + "Erro ao recuperar roles: " + e.getClass().getName() + ": " + e.getMessage());
succeeded = false;
throw new LoginException("Erro ao recuperar roles: " + e.getClass().getName() + ": " + e.getMessage());
} finally {
try {
if (rs != null)
rs.close();
if (statement != null)
statement.close();
} catch (Exception e) {

}
}
}

/**
* Login do usuário.
*/
protected String loginInformado;

/**
* Senha do usuário.
*/
protected String senhaInformado;

/**
* Obtem o login e senha digitados
*/
protected void getUsernamePassword() throws LoginException {
System.err.println("8xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
if (callbackHandler == null) {
System.err.println("8 callbackHandler == null");
throw new LoginException("Error: no CallbackHandler available to garner authentication information from the user");
}
Callback[] callbacks = new Callback[2];
callbacks[0] = new NameCallback("Login");
callbacks[1] = new PasswordCallback("Senha", false);
try {
callbackHandler.handle(callbacks);
loginInformado = ((NameCallback) callbacks[0]).getName();
char[] tmpPassword = ((PasswordCallback) callbacks[1]).getPassword();
senhaInformado = new String(tmpPassword);
((PasswordCallback) callbacks[1]).clearPassword();
} catch (java.io.IOException ioe) {
System.err.println("8 ioe");
throw new LoginException(ioe.toString());
} catch (UnsupportedCallbackException uce) {
System.err.println("8 uce");
throw new LoginException("Error: " + uce.getCallback().toString() + " not available to garner authentication information from the user");
}
}
}
MandrackMago
Entusiasta Java

Membro desde: 05/03/2008 14:42:25
Mensagens: 20
Localização: Brasilia DF
Offline

Cara formata a parada assim....



A minha duvida era essa... não sei explicar mas só funciona se colocar


Jacaré que vacila vira bolsa de madame.
cgneo
HelloWorld

Membro desde: 23/08/2007 00:29:48
Mensagens: 10
Offline

Camarada funcionou com o Roles.

Muito obrigado, vou tentar descobrir porque depois coloco no fórum.

Só mais uma dúvida/problema que provavelmente você já deve ter enfrentado.

Agora consegui realizar autenticação e autorização (com a sua ajuda), mas vamos dizer que estou logado com um usuário e quero logar com outro na mesma sessão, ou seja, clico no link da página de login.jsp e entro com outro usuário aparece a seguinte mensagem.

HTTP Status 404 - /teste/j_security_check

Sabe porque? Como contorno isto?

MandrackMago
Entusiasta Java

Membro desde: 05/03/2008 14:42:25
Mensagens: 20
Localização: Brasilia DF
Offline

Bom ... isso eu não sei .... e também não sei porque fazer isso... logar 2 usuarios na mesma sessão?

Jacaré que vacila vira bolsa de madame.
cgneo
HelloWorld

Membro desde: 23/08/2007 00:29:48
Mensagens: 10
Offline

Vou tentar melhorar minha pergunta.

Como faço para o container acionar o método logout?

Att,

Anderson de Lima.
MandrackMago
Entusiasta Java

Membro desde: 05/03/2008 14:42:25
Mensagens: 20
Localização: Brasilia DF
Offline

Bom ... eu estrou usando



Não fiz os testes ainda com o modulo web, mas está funcionando... o problema é que eu acho que ele está guardando na memória o registro do usuario e da segunda vez eu eu logo ele não busca novamente do banco.

Estou usando a validação em um webservice então como ele é stateless não preciso preocupar com o logout, eu acho.

Jacaré que vacila vira bolsa de madame.
cgneo
HelloWorld

Membro desde: 23/08/2007 00:29:48
Mensagens: 10
Offline

Então amigo,

estou fazendo da mesma forma com session invalidate e ele está também cacheando em algum lugar, porque quando logo a segunda vez ele não consulta de novo no banco.

Além disso, quando executo o invalidate ele não esta chamando o método logout da classe LoginModule.

Queria saber qual evento tenho que gerar para chamar o método logout implementado, pois dai acredito que vai funcionar.

Será que ninguém aqui enfrentou este problema que estamos conversando.

Abraço,
MandrackMago
Entusiasta Java

Membro desde: 05/03/2008 14:42:25
Mensagens: 20
Localização: Brasilia DF
Offline

É eu reparei nisso. Com webservice ele verifica todas as vezes em que chamo um método, no meu caso, era exatamente o que queria, então não me preocupei com o logout. Pelo que li em um livro PDF - Jaas in Action http://www.jaasbook.com/ ele usa o session invalidate quando utilizado em aplicações web. Só consegui usar o logout quando faço login através do LoginContext, em vez de usar o form.

Jacaré que vacila vira bolsa de madame.
MandrackMago
Entusiasta Java

Membro desde: 05/03/2008 14:42:25
Mensagens: 20
Localização: Brasilia DF
Offline

Alguém ai ja usou o LoginContext? Como eu aponto ele para o jboss? Preciso logar uma aplicação swing.

Jacaré que vacila vira bolsa de madame.
 
Índice dos Fóruns » Desenvolvimento Web
Ir para:   
Powered by JForum 2.1.8 © JForum Team