Não consigo realizar o login com Spring Security [RESOLVIDO]

24 respostas
J

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:beans xmlns="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-url pattern="/admin/**" access="ROLE_ADMINISTRADOR" />
        <intercept-url pattern="/restrito/**" access="ROLE_USUARIO" />
  
        <form-login login-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-encoder hash="md5"/>
            <jdbc-user-service data-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>

24 Respostas

J

e aqui tá a minha página de login

<?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">
<html xmlns="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:commandButton action="#{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:panelGroup rendered="#{!empty param.login_error}">
                <span style="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>

         <form id="login" method="post" action="${request.contextPath}/j_spring_security_check">
            <table>
                <tr><td>Login</td>
                        <td><input type='text' name='j_username'/></td></tr>
                <tr><td>Senha</td>
                        <td><input type='password' name='j_password'/></td></tr>
                <tr><td align="right"><input type="checkbox" name="_spring_security_remember_me"/></td><!-- Habilita o login automatico se a opção for marcada-->
                        <td>Entrar automaticamente</td></tr>
                <tr><td>&nbsp;</td>
                        <td><input type="submit" value="Entrar"/></td>
                </tr>
            </table>
            <script>
                    document.getElementById("login").j_username.value = "#{SPRING_SECURITY_LAST_USERNAME}";
            </script>
        </form>

</html>
J

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

Cara, então… eu não costumo fazer desse jeito,
mas vou mandar um exemplo de como eu faço:

meu applicationContext-security:

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
	xmlns:beans="http://www.springframework.org/schema/beans" xmlns:aop="http://www.springframework.org/schema/aop"
	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/aop 
		http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
		http://www.springframework.org/schema/security 
		http://www.springframework.org/schema/security/spring-security-3.1.xsd">

	<beans:bean id="concurrencyFilter"
		class="org.springframework.security.web.session.ConcurrentSessionFilter">
		<beans:property name="sessionRegistry" ref="sessionRegistry" />
		<beans:property name="expiredUrl" value="/session-expired.htm" />
	</beans:bean>

	<beans:bean id="sas"
		class="org.springframework.security.web.authentication.session.ConcurrentSessionControlStrategy">
		<beans:constructor-arg name="sessionRegistry"
			ref="sessionRegistry" />
		<beans:property name="maximumSessions" value="1" />
	</beans:bean>

	<beans:bean id="sessionRegistry"
		class="org.springframework.security.core.session.SessionRegistryImpl" />

	<http auto-config="true" use-expressions="true">
		<intercept-url pattern="/changePassword.jsf" access="isAuthenticated()" />
		<intercept-url pattern="/myAccount.jsf" access="isAuthenticated()" />
		<intercept-url pattern="/myOrders.jsf" access="isAuthenticated()" />
		<intercept-url pattern="/order.jsf" access="isAuthenticated()" />
		<intercept-url pattern="/forgotPassword.jsf" access="isAnonymous()" />
		<intercept-url pattern="/createAccount.jsf" access="isAnonymous()" />
		<form-login login-page="/index.jsf" default-target-url="/index.jsf"
			authentication-failure-url="/index.jsf?erro=true"
			always-use-default-target="true" />

		<custom-filter position="CONCURRENT_SESSION_FILTER" ref="concurrencyFilter" />
		<session-management
			session-authentication-strategy-ref="sas" />
	</http>

	<beans:bean id="authProvider" class="com.security.Authenticator">
		<aop:scoped-proxy />
	</beans:bean>

	<beans:bean id="userSession" class="com.beans.UserSession"
		scope="session">
		<aop:scoped-proxy />
	</beans:bean>

	<authentication-manager>
		<authentication-provider ref="authProvider" />
	</authentication-manager>

</beans:beans>

dessa forma, você fala que a sua classe Authenticator vai cuidar da sua autenticação.

e aqui a classe Authenticator

@Component
@Scope("request")
public class Authenticator extends AbstractBean implements AuthenticationProvider {
	private static final long serialVersionUID = -3760269533661102670L;

	@Autowired
	private IUserDAO userDao;

	@Autowired
	private UserSession session;
	
	private User user;
	
	@PostConstruct
	public void init() {
		user = new User();
		user.setRoles(new ArrayList<Role>());
	}
	
	public String login() {
		try {
			user.setPassword(PasswordUtils.getHash(user.getPassword()));
			user = userDao.getLogin(user);

			if (user != null) {
				user.setPassword("");
				
				UsernamePasswordAuthenticationToken authToken = new UsernamePasswordAuthenticationToken(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 (Exception ex) {
			messageError("Error: " + ex.getMessage());
			ex.printStackTrace();
			return "";
		}
	}
	
	public String logout(){
		session.setUser(null);
		SecurityContextHolder.clearContext();
		removeBean("userSession");
		removeBean("orderBean");
		return "index";
	}
L

A senha no banco tem q ser criptografada.
Vc está fazendo isso??

J

lazaropj, ah senha do banco não estar criptografada!!
como faço para criptografaR?

J

A unica criptografia que eu tenho é essa:

<password-encoder hash="md5"/>

que fica no aquivo applicationContext-security

L

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

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

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

então como eu faço a criptografia na senha ?

L

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

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

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

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

Estou utilizando HQL, porem eu ja vasculhei toda a minha aplicação e nao encontrei nenhum insert :open_mouth:

L

joaolenosi:
Estou utilizando HQL, porem eu ja vasculhei toda a minha aplicação e nao encontrei nenhum insert :open_mouth:

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

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

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

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?
HTTP Status 403 - Access is denied  
      
    type Status report  
      
    message Access is denied  
      
    description Access to the specified resource (Access is denied) has been forbidden.  
    Apache Tomcat/7.0.22
L
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?
HTTP Status 403 - Access is denied  
      
    type Status report  
      
    message Access is denied  
      
    description Access to the specified resource (Access is denied) has been forbidden.  
    Apache Tomcat/7.0.22

Isso eu não sei não!!

L
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?
HTTP Status 403 - Access is denied  
      
    type Status report  
      
    message Access is denied  
      
    description Access to the specified resource (Access is denied) has been forbidden.  
    Apache Tomcat/7.0.22

Nada impede de vc usar HQL e SQL no mesmo projeto, ou até na mesma classe!!

J

Beleza então!

Obrigado :slight_smile:

L

joaolenosi:
Beleza então!

Obrigado :)

Coloca o tópico como resolvido.

J

:slight_smile:

Criado 11 de julho de 2012
Ultima resposta 11 de jul. de 2012
Respostas 24
Participantes 3