Não consigo realizar o login com Spring Security [RESOLVIDO]
24 respostas
J
joaolenosi
Ola pessoal estou acompanhando um livro de programação web, criei a parte de segurança do sistema com Spring Security, porem quando eu vou realizar o login, eu não consigo.
Coloco os meus dados que estar no banco, é mesmo assim diz que meu login tá errado.
aqui é meu applicationContext-Security
<?xml version="1.0" encoding="UTF-8"?><b:beansxmlns="http://www.springframework.org/schema/security"xmlns:b="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.0.xsd"><http><intercept-urlpattern="/admin/**"access="ROLE_ADMINISTRADOR"/><intercept-urlpattern="/restrito/**"access="ROLE_USUARIO"/><form-loginlogin-page="/publico/login.jsf"always-use-default-target="true"default-target-url="/restrito/principal.jsf"authentication-failure-url="/publico/login.jsf?login_error=1"/><logout/></http><authentication-manager><authentication-provider><password-encoderhash="md5"/><jdbc-user-servicedata-source-ref="financeiroDataSource"authorities-by-username-query="SELECT u.login, p.permissao FROM usuario u, usuario_permissao p WHERE u.codigo = p.usuario AND u.login = ?"users-by-username-query="SELECT login, senha, ativo FROM usuario WHERE login = ?"/></authentication-provider></authentication-manager></b:beans>
<?xml version="1.0" encoding="ISO-8859-1"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><htmlxmlns="http://www.w3.org/1999/xhtml"xmlns:ui="http://java.sun.com/jsf/facelets"xmlns:h="http://java.sun.com/jsf/html"xmlns:f="http://java.sun.com/jsf/core"><h:form><h:commandButtonaction="#{usuarioBean.novo}"value="Registre-se"/></h:form><!-- O conteudo do panelGroup só sera exibido caso algum erro de login. a UEL !empty param.login_error testa a existencia de algum paramento no conteudo login_error. a url configurada para erro de login repassa o parametro login-error. exemplo /publico/login.jsf?login_error=1"--><h:panelGrouprendered="#{!empty param.login_error}"><spanstyle="font-color:red"> Erro ao efetuar o login.</span><br/><br/>
Motivo: #{SPRING_SECURITY_LAST_EXCEPTION.message}<!-- Armazena a mensagem de erro gerada pelo o spring --></h:panelGroup><formid="login"method="post"action="${request.contextPath}/j_spring_security_check"><table><tr><td>Login</td><td><inputtype='text'name='j_username'/></td></tr><tr><td>Senha</td><td><inputtype='password'name='j_password'/></td></tr><tr><tdalign="right"><inputtype="checkbox"name="_spring_security_remember_me"/></td><!-- Habilita o login automatico se a opção for marcada--><td>Entrar automaticamente</td></tr><tr><td> </td><td><inputtype="submit"value="Entrar"/></td></tr></table><script>document.getElementById("login").j_username.value="#{SPRING_SECURITY_LAST_USERNAME}";</script></form></html>
J
joaolenosi
Eu fiz a seguinte quey, pra verificar se usuario que eu estava tentando efetuar o login tinha permissão de role_usurio.
SELECT login, permissao FROM usuario, usuario_permissao WHERE codigo = usuario and login = 'administrador';
E a query resultou, que eu tinha, porem quando vou logar, apareçe essa mensagem:
Erro ao efetuar o login.
Motivo: Bad credentials
K
kcobainnn
Cara, então… eu não costumo fazer desse jeito,
mas vou mandar um exemplo de como eu faço:
dessa forma, você fala que a sua classe Authenticator vai cuidar da sua autenticação.
e aqui a classe Authenticator
@Component@Scope("request")publicclassAuthenticatorextendsAbstractBeanimplementsAuthenticationProvider{privatestaticfinallongserialVersionUID=-3760269533661102670L;@AutowiredprivateIUserDAOuserDao;@AutowiredprivateUserSessionsession;privateUseruser;@PostConstructpublicvoidinit(){user=newUser();user.setRoles(newArrayList<Role>());}publicStringlogin(){try{user.setPassword(PasswordUtils.getHash(user.getPassword()));user=userDao.getLogin(user);if(user!=null){user.setPassword("");UsernamePasswordAuthenticationTokenauthToken=newUsernamePasswordAuthenticationToken(user.getLogin(),null,user.getRoles());authToken.setDetails(user);SecurityContextHolder.createEmptyContext();SecurityContextHolder.getContext().setAuthentication(authToken);session.setUser(user);return"index";}messageWarning("Login ou senha inválidos, por favor, tente novamente");return"";}catch(Exceptionex){messageError("Error: "+ex.getMessage());ex.printStackTrace();return"";}}publicStringlogout(){session.setUser(null);SecurityContextHolder.clearContext();removeBean("userSession");removeBean("orderBean");return"index";}
L
lazaropj
A senha no banco tem q ser criptografada.
Vc está fazendo isso??
J
joaolenosi
lazaropj, ah senha do banco não estar criptografada!!
como faço para criptografaR?
J
joaolenosi
A unica criptografia que eu tenho é essa:
<password-encoder hash="md5"/>
que fica no aquivo applicationContext-security
L
lazaropj
joaolenosi:
lazaropj, ah senha do banco não estar criptografada!!
como faço para criptografaR?
A aplicação aqui usa o MySQL.
E no MySQL tem a função md5 nele.
Qual banco vc está usando?
J
joaolenosi
você tem razao eu removi a criptografia do meu spring security e consegui logar.
porem eu quero deixar criptogrado!!
estou utilizando o mysql –
como eu faço pra cirptografar esse campo ?
L
lazaropj
joaolenosi:
A unica criptografia que eu tenho é essa:
<password-encoder hash="md5"/>
que fica no aquivo applicationContext-security
com esse password-encoder vc está mandando descriptografar a senha q ñ esta usando criptografia.
Ou vc deixa isso e faz criptografia na senha, ou vc tira isso aí e deixa a senha como está.
J
joaolenosi
então como eu faço a criptografia na senha ?
L
lazaropj
joaolenosi:
você tem razao eu removi a criptografia do meu spring security e consegui logar.
porem eu quero deixar criptogrado!!
estou utilizando o mysql –
como eu faço pra cirptografar esse campo ?
É só salvar a senha usando o md5.
por exemplo um insert:
insert into usuario values (“nome”, md5(“1234”))
Daí esse 1234 vai virar algo assim:
asdf4a4gwe54r454f21
Entendeu?
J
joaolenosi
Lazaro ninja, entendi o problema !
No livro diz o seguinte
<password-encoder hash="md5"/>
Então significa que eu tenho que criptografar o meu campo senha no mysql!
J
joaolenosi
entendi, eu consigo fizer assim diretamente no banco de dados.
e dentro da minha aplicação como ficaria, para que no momento do cadastro, ele já cadastra-se com a criptografia md5 ?
L
lazaropj
joaolenosi:
entendi, eu consigo fizer assim diretamente no banco de dados.
e dentro da minha aplicação como ficaria, para que no momento do cadastro, ele já cadastra-se com a criptografia md5 ?
Para vc fazer um insert no banco, vc pode usar o HQL ou SQL navito.
Aí vc pode fazer o insert pela aplicação.
J
joaolenosi
Estou utilizando HQL, porem eu ja vasculhei toda a minha aplicação e nao encontrei nenhum insert
L
lazaropj
joaolenosi:
Estou utilizando HQL, porem eu ja vasculhei toda a minha aplicação e nao encontrei nenhum insert
Então na hora de salvar o usuario, vc deve estar usando um em.persist ou um save, correto?
Troca esse modo de gravar o usuario pelo um insert…
Não sei se o hibernate já salva em md5
J
joaolenosi
Lazoro, que eu saiba o hibernate não aceita insert !
estou salvando os usuarios cadastrados da seguinte forma.:
public void salvar(Usuario usuario){
Integer codigo = usuario.getCodigo();
if(codigo == null || codigo == 0){ //if usuario for novo, então eu cadastro, se não só atualizo.
usuario.getPermissao().add("ROLE_USUARIO");//Adiciona permissão de Papel de usuario
this.usuarioDAO.salvar(usuario);
}
else{
this.usuarioDAO.atualizar(usuario);
}
}
eu acho que essa criptografia MD5 deve ser definida no momento da criação da tabela !
faz sentido ?
L
lazaropj
joaolenosi:
Lazoro, que eu saiba o hibernate não aceita insert !
estou salvando os usuarios cadastrados da seguinte forma.:
public void salvar(Usuario usuario){
Integer codigo = usuario.getCodigo();
if(codigo == null || codigo == 0){ //if usuario for novo, então eu cadastro, se não só atualizo.
usuario.getPermissao().add("ROLE_USUARIO");//Adiciona permissão de Papel de usuario
this.usuarioDAO.salvar(usuario);
}
else{
this.usuarioDAO.atualizar(usuario);
}
}
eu acho que essa criptografia MD5 deve ser definida no momento da criação da tabela !
faz sentido ?
Não sei se faz sentido… mas pode ser sim… vale a pena conferir isso…
E o Hibernate aceita qualquer tipo de SQL sim, cara…
Esse método salvar, do usuarioDAO, deve estar usando o persist ou o save, correto?
Lá q vc deve mudar para fazer o insert na mão!!
J
joaolenosi
Lá estar usando o metodo save.
Estou utilizando HQL, e não SQL.
Beleza vou tentar aqui, pra vê se consigo resolver.
Sim aproveitando a converssa, você sabe por que quando tento logar com o papel de administrador apareçe essa mensagem de acesso negado?
Lá estar usando o metodo save.
Estou utilizando HQL, e não SQL.
Beleza vou tentar aqui, pra vê se consigo resolver.
Sim aproveitando a converssa, você sabe por que quando tento logar com o papel de administrador apareçe essa mensagem de acesso negado?
Lá estar usando o metodo save.
Estou utilizando HQL, e não SQL.
Beleza vou tentar aqui, pra vê se consigo resolver.
Sim aproveitando a converssa, você sabe por que quando tento logar com o papel de administrador apareçe essa mensagem de acesso negado?