Oi, pessoal, já postei outros tópicos e não obtive nehuma resposta, tenho que implementar um esquema login senha em uma aplicação web usando Struts2 e Hibernate, conectado com uma base Oracle onde os usuários estão em uma tabela que está em outra base fora da base da aplicação, já tentei fazer com jdbcrealm conforme exemplos que encontrei na net, mas não funciona, alguém sabe como posso faer isso? Atualmente, essa aplicação roda no TomCat, mas está com muitos problemas, de vez em quando dá altos paus estranhos, e eu precisava migrar, mas, segundo minhas pesquisas, parece que isso (que quero fazer) é um tanto inédito, alguém sabe com fazer autenticação no glassfish? Alguém usa essa criatura pelo menos.
Essa bomba chamada Glassfish
7 Respostas
http://www.developinjava.com/articles.php?article_id=5
http://www.developinjava.com/articles.php?article_id=6
Eu concordaria com você se você dissesse que o iPlanet (antigo application server da Sun, com uma mistura indecente de código nativo e Java) é uma bomba. Mas não concordo com a sua opinião a respeito do Glassfish.
Com ref. ao Realm(DataSource)
1- Vc. copiou os arquivos .jar para a a pasta \lib do seu servidor.
2-Vc. criou om poll de conexões.
Resources==>JDBC ==Connection Pools == new.etc… ??? (o ping da sua conexão foi " succeded)
3-Registrou o data source ???.
-JNDI -nome pool-descricao.??
Quanto ao Hibernate .:
http://www.hibernate.org/374.html
http://blogs.sun.com/GlassFishPersistence/entry/use_hibernate_as_a_persistence
Verifique o seu arquivo “persistence.xml”.
segundo minhas pesquisas, parece que isso (que quero fazer) é um tanto inédito, alguém sabe com fazer autenticação no glassfish? Alguém usa essa criatura pelo menos.Inédito é o time do Dunga ganhar um partida, estude com calme o manual do Glass, qualquer coisa volte ao post.
Boa sorte.
sds.
Hehe, eu criei um connectionPool, tudo certo, sem a segurança funciona perfeito, mas quando eu habilito a segurança esquece, nem entra, vai pra meu form de erro, por isso eu fiquei meio revoltado é só.
Eu concordaria com você se você dissesse que o iPlanet (antigo application server da Sun, com uma mistura indecente de código nativo e Java) é uma bomba. Mas não concordo com a sua opinião a respeito do Glassfish.De acordo…rs…rs…nem me fale em iPlanet .
O que eu mais vejo aqui:
Web login failed: Login failed: javax.security.auth.login.LoginException: Failed file login for 19294.
Hummm…verifique onde vc. esta usando "import javax.security.auth.login.LoginException; ", as suas throws LoginException seus roles, suas classes de login,
coloque o código ai pra gente ver.ok…
Classe login
package application.security;
import application.security.*;
import dao.DAOFactory;
import dto.Pessoa;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
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;
public class Login implements LoginModule {
private boolean commitSucceeded = false;
private boolean succeeded = false;
private User user;
private Set roles = new HashSet();
protected Subject subject;
protected CallbackHandler callbackHandler;
protected Map sharedState;
protected String loginInformado;
protected String senhaInformado;
public void initialize(Subject subject, CallbackHandler callbackHandler, Map sharedState, Map options) {
this.subject = subject;
this.callbackHandler = callbackHandler;
this.sharedState = sharedState;
}
public boolean login() throws LoginException {
getUsernamePassword();
try {
Pessoa pessoa = DAOFactory.instance(DAOFactory.HIBERNATE).getPessoa().findById(Integer.parseInt(loginInformado), false);
if (pessoa == null) throw new LoginException("Usuário inválido!");
roles.addAll(pessoa.getRegras());
user.setName(loginInformado);
user.setRoles(roles);
succeeded = true;
} catch (NumberFormatException ex) {
throw new LoginException("Usuário inválido.");
}
sharedState.put("javax.security.auth.principal", user);
sharedState.put("javax.security.auth.roles", roles);
return true;
}
public boolean commit() throws LoginException {
if (user != null && !subject.getPrincipals().contains(user)) {
subject.getPrincipals().add(user);
}
if (roles != null) {
Iterator it = roles.iterator();
while (it.hasNext()) {
Role role = (Role) it.next();
if (!subject.getPrincipals().contains(role)) {
subject.getPrincipals().add(role);
}
}
}
commitSucceeded = true;
return true;
}
public boolean abort() throws LoginException {
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 {
subject.getPrincipals().removeAll(roles);
subject.getPrincipals().remove(user);
return true;
}
protected void getUsernamePassword() throws LoginException {
if (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) {
throw new LoginException(ioe.toString());
} catch (UnsupportedCallbackException uce) {
throw new LoginException("Error: " + uce.getCallback().toString() + " not available to garner authentication information from the user");
}
}
}
pode até ser esse o problema, no TomCat não foi usado jdbcrealm, tipo no layout ta assim:
boolean proposta = !(request.isUserInRole("ASSADM") || request.isUserInRole("GERADM"));
boolean ordens = !(request.isUserInRole("ASSADM") || request.isUserInRole("GERADM"));
boolean material = !(request.isUserInRole("ASSADM") || request.isUserInRole("GERADM") || request.isUserInRole("ALMOXARIFADO"));
boolean analysis = !(request.isUserInRole("TECNICO") || request.isUserInRole("GERADM"));
boolean reports = !(request.isUserInRole("ASSADM") || request.isUserInRole("GERADM"));
boolean analysisReport = !(request.isUserInRole("ASSADM") || request.isUserInRole("GERADM"));
boolean parameters = !(request.isUserInRole("ASSADM") || request.isUserInRole("GERADM"));
%>
na parte do menu, não sei se tem como fazer um esquema parecido no glass.