Viva,
consigo fazer o login com o JAASRealm. Mas estou não estou a usar o login com FORM mas sim com BASIC. Estou a usar uma servlet com session.invalidate(). Não me aparece a janela realm de autenticação depois de fazer o logout…alguém me pode dizer qual é o meu erro?
Cumprimentos,
Mazarama
Onde eu adiciono o arquivo de configuração b [/b].
Na minha aplicação, implementei a classe de LoginModule, web.xml, JSPs, adicionei o Realm no server.xml(com as devidas configurações do BD), etc… mas esse arquivo nãio sei onde colocar…
Alguém poderia me ajudar ???
jaboot
Fevereiro 7, 2007, 2:40pm
#23
Olá a todos,
Só estou postando para agradecer a boa vontade do fviana em criar esse tutorial.
Meus parabéns. Espero poder ajudar desta forma ou de outra assim que possível.
Ola pessoal!
Sabem dizer-me como posso aplicar o logout(), isto é, como posso chamar essa função em html ou numa servlet?
Obrigado
recoma
Dezembro 20, 2007, 11:44am
#25
Como pego o tipo de Erro/Exception da autenticação no meu jsp de resultado??
Por exemplo:
1 - Senha errada!
2 - Senha vencida!
3 - Primeira vez que acessa -> troque a senha!
4 …
Leozin
Dezembro 20, 2007, 11:46am
#26
[quote=luisilvaJAVA]Ola pessoal!
Sabem dizer-me como posso aplicar o logout(), isto é, como posso chamar essa função em html ou numa servlet?
Obrigado[/quote]
session.invalidate()
Pessoal dúvida simples, de onde vem os outros paramentros para a conexão com o banco tipo usuario, senha, …? Antes que me esqueça um otimo tutorial, valeu.
dataSourceName="jdbc/GUJ"
Esqueleto
public void doLogout(ActionEvent event) throws IOException{
final HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
request.getSession( false ).invalidate();
FacesContext.getCurrentInstance().getExternalContext().redirect("/aplicacao");
}
Cara, alguém conseguiu fazer isso funcionar assim como está descrito? Tive que fazer um grupo de Roles implementando Group e adicionando Role ao grupo.
tipo:
grupoRole.addMember(new Role("admin'));
grupoRole.addMember(new Role("logado));
subject.getPrincipals().add(UsuarioPrincipal("teste"));
subject.getPrincipals().add(grupoRole);
Queria saber como auntenticar em um WebService via swing. Alguém ai sabe?
cgneo
Abril 1, 2008, 1:26am
#30
Pessoal,
implementei seguindo este tutorial com a classe GujLoginModule tudo direitinho.
Coloquei logs e ele esta chamando o método login, validando o usuário e no final chamando o método commit() certinho.
Quando ele terminar o método commit retorna para tela a seguinte mensagem :
HTTP Status 403 - Access to the requested resource has been denied
Alguém sabe me dizer por que?
Obrigado
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
cgneo
Abril 4, 2008, 12:14am
#32
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");
}
}
}
Cara formata a parada assim…
private GroupRole grupoRole = new GroupRole("abc");
A minha duvida era essa… não sei explicar mas só funciona se colocar
private GroupRole grupoRole = new GroupRole("Roles");
cgneo
Abril 4, 2008, 11:09am
#34
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?
Bom … isso eu não sei … e também não sei porque fazer isso… logar 2 usuarios na mesma sessão?
cgneo
Abril 7, 2008, 11:33pm
#36
Vou tentar melhorar minha pergunta.
Como faço para o container acionar o método logout?
Att,
Anderson de Lima.
Bom … eu estrou usando
session.invalidate();
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.
cgneo
Abril 8, 2008, 9:39pm
#38
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,
É 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.
Alguém ai ja usou o LoginContext? Como eu aponto ele para o jboss? Preciso logar uma aplicação swing.