| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 01/04/2008 08:01:59
|
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. |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 04/04/2008 00:14:30
|
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");
}
}
}
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 04/04/2008 08:03:49
|
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. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 04/04/2008 11:09:07
|
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?
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 04/04/2008 13:41:00
|
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. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 07/04/2008 23:33:55
|
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.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 08/04/2008 08:38:26
|
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. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 08/04/2008 21:39:09
|
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,
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 09/04/2008 07:40:11
|
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. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 09/04/2008 08:34:59
|
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. |
|
|
 |
|
|