Solucionado (ver solução)
Solucionado
(ver solução)
11
respostas

Spring MVC II - Spring Security não redireciona automaticamente para tela de Login

Pessoal, boa tarde. Estou na aula 04 do curso Spring MVC II e fiz as configurações do Spring MVC para utilizar a funcionalidade de login, porém não está funcionando. O Spring não redireciona, em nenhum momento, para uma tela de login. Posso acessar diretamente a tela de cadastro de produtos por exemplo.

Estou abrindo esse tópico pois pesquisei todos os tópicos abertos neste curso, e não achei nenhum que resolveu o meu problema.

ServletSpringMVC

package br.com.casadocodigo.loja.conf;

import javax.servlet.Filter;
import javax.servlet.MultipartConfigElement;
import javax.servlet.ServletRegistration.Dynamic;
import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

public class ServletSpringMVC extends AbstractAnnotationConfigDispatcherServletInitializer{

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[] {SecurityConfiguration.class, AppWebConfiguration.class, JPAConfiguration.class};
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[] {};
    }

    @Override
    protected String[] getServletMappings() {

        return new String[] {"/"};
    }

    @Override
    protected Filter[] getServletFilters() {

        CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
        characterEncodingFilter.setEncoding("UTF-8");

        return new Filter[] {characterEncodingFilter};
    }

    @Override
    protected void customizeRegistration(Dynamic registration) {
        registration.setMultipartConfig(new MultipartConfigElement(""));
    }

}

SecurityConfiguration

package br.com.casadocodigo.loja.conf;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpMethod;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import br.com.casadocodigo.loja.dao.UsuarioDao;

// Aqui eu testei com as duas notações, usando versões diferentes do spring-security no pom. Nenhuma delas funcionou.

//@EnableWebMvcSecurity
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Autowired
    private UsuarioDao usuarioDao;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
        .antMatchers("/produtos/form").hasRole("ADMIN")
        .antMatchers("/carrinho/**").permitAll()
        .antMatchers(HttpMethod.POST, "/produtos").hasRole("ADMIN")
        .antMatchers(HttpMethod.GET, "/produtos").hasRole("ADMIN")
        .antMatchers("/produtos/**").permitAll()
        .antMatchers("/resources/**").permitAll()
        .antMatchers("/").permitAll()
        .anyRequest().authenticated()
        .and().formLogin();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(usuarioDao)
            .passwordEncoder(new BCryptPasswordEncoder());
    }

}

SpringSecurityFilterConfiguration

package br.com.casadocodigo.loja.conf;

import org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer;

public class SpringSecurityFilterConfiguration extends AbstractSecurityWebApplicationInitializer{

}

Pesquisei muito no Stack Overflow. Fiz outros tutoriais que encontrei. Mudei as versões usadas no pom.xml (usei a 4.0.0.M2 apresentada no curso, 4.0.3.RELEASE, 4.2.3.RELEASE que tem no mvnrepository). Deletei o deploy da aplicação no Wildfly e coloquei novamente. Nada.

Meu pom.xml está assim agora:

org.springframework.security
spring-security-config
4.0.3.RELEASE

org.springframework.security
spring-security-taglibs
4.0.3.RELEASE

org.springframework.security
spring-security-web
4.0.3.RELEASE

org.springframework.security
spring-security-core
4.0.3.RELEASE

Algumas infos que podem ser úteis: To usando Wildfly 11; MySql 5.6.39 Eclipse Oxygen 2.

Quando avancei um pouco mais na aula, reparei que o Spring não criou automaticamente a tabela Usuario no banco de dados. Sei que isso pode ser um problema diferente, mas me fez questionar se fiz alguma configuração do Spring errado. De qualquer forma, revisei a classe JPAConfiguration e está ok.

Se precisarem de mais alguma informação, classe, configuração, por favor me avisem.

Muito obrigado!

11 respostas

Opa Andrey, primeiramente obrigado por detalhar tão bem a sua dúvida. Realmente olhando seu código eu não vi nada de muito errado, então minha sugestão é que você coloque esse código no github e avise aqui. Vou tentar baixar e executar, para verificar...

Uma coisa que você pode ver é se as classes que representam o usuário e perfil estão com annotation @Entity, já que a tabela não foi criada...

Oi Alberto.

Coloquei o projeto no github. Segue link: https://github.com/andreybevilacqua/SpringMVC

Existem diversos comentários no fonte, onde eu explico pra mim mesmo o conteúdo do curso. Te peço para ignorar esses comentários.

Verifiquei aqui e as classes usuário e roles estão com a notação @Entity. Fiz outros testes, alterando as configurações da JPA para "create":

properties.setProperty("hibernate.hbm2ddl.auto", "create");

Segue sem criar as tabelas no banco. Mas tudo bem, esse é um segundo problema.

Desde já, muito obrigado pelo auxílio.

Oi Andrey, mil perdões pela demora :(. Eu fiz o download do seu código, importei no eclipse e subi o projeto. A tabela foi criada e quando eu tentei acessar a página de cadastro de produtos eu fui direcionado para a tela de login.

A única diferença é que eu subi o projeto no tomcat, simplesmente porque o wildfly não é necessário no projeto e, para ser sincero, não é necessário em um projeto que usa Spring. A não ser que você queira usar algum recurso específico dele. Por outro lado, o servidor não deveria ser o problema :).

Vamos ver se outras pessoas testam o código, mas acho que vai funcionar corretamente também.

Oi Alberto.

Tranquilo, muito obrigado pelo retorno! Usei o Wildfly porque já tenho o servidor configurado no Eclipse de outros projetos.

Eu vi na aula 1 do Spring MVC I que o instrutor instala o Tomcat 7 para fazer o projeto, acredito que deve ser o mesmo que tu estás utilizando. Eu baixei ele e fiz o deploy, porém, nada de diferente aconteceu. O problema persiste.

Agora sabemos que é algum problema de ambiente, e não no projeto. Tu comentou que o Wildfly não é necessário em nenhum projeto que usa Spring. Nesse caso, eu só posso usar o Tomcat? Eu preciso fazer a configuração de um servidor de aplicação e fazer o deploy da aplicação manualmente, correto?

Novamente, muito obrigado pelo suporte!

Opa, não é que só pode usar o Tomcat, mas ele com certeza é suficiente :). Não sei se entendi bem a pergunta do deploy, mas manualmente é uma possibilidade. Lembrando, você pode usar o wuldfly, realmente não deveria dar problema.

Eu fiquei com a dúvida sobre como eu devo fazer o deploy e executar uma aplicação Spring. Baixei o tomcat 7 e fiz o deploy, e ainda não criou as tabelas nem redireciona para a tela de Login.

Opa, entendi. O deploy é no fluxo normal, associa o projeto com o tomcat pelo eclipse e já foi. Se fosse em produção, você deve ter instalado um tomcat na máquina, pegar o war gerado pelo maven e jogar lá.

Em relação as tabelas e o direcionamento eu realmente não sei o que pode ser, já que eu baixei e tudo funcionou corretamente. Estou vendo se mais alguém pode baixar para testar.

solução!

Fala Andrey e Alberto, tudo bem ?

Testei por aqui também e tudo deu certo. Fui redirecionado para o Login quando tentei acessar o form de cadastro de produtos...

redirect

E as tabelas também foram criadas..

db_tables

Estou testando num Tomcat 8, mas como dito antes, isso não apresenta nenhum tipo de diferença em relação a utilização de outros containers Servlet. Parece estar mesmo tudo ok com o código.

Abraço!

Oi Alberto.

Eu revisei toda a aula 4. Comecei do início, revisei toda a implementação, dependências, etc. Deletei o deploy do Wildfly, fiz um Maven > Update Project (pra garantir que está com as mesmas dependências da aula). Fiz um Maven Clean Install -U, e realizei o deploy novamente no Wildfly.

Agora funcionou. Não sei o porque... Criou as tabelas no banco também...

Agora estou me questionando o motivo de tudo. Atualizar as dependências, na minha opinião, não faria sentido ser o motivo, porque as tabelas Usuario e Roles não estavam sendo criadas no banco. Agora, além de encaminhar automaticamente para a tela de Login, ele criou as tabelas também. Deletar o deploy, fazer um novo build e realizar novamente o deploy também não seria, porque eu fiz isso umas 40x antes de abrir a pergunta. A única mudança foi criar um server Tomcat, o qual está desligado e, que nem tu falou, o Wildfly ou Tomcat não deveriam ser o motivo do problema.

Eu realmente não sei o motivo, só sei que está funcionando agora. Muito obrigado pelo suporte Alberto! Se eu descobrir algo vou postar aqui (e se tu souber também, por favor me avise huahuauah).

Grande abraço!

Oi Rafael. Vi tua resposta após eu fazer meu post acima. Obrigado pelo suporte! Conforme falei acima, ta funcionando aqui também agora, e não descobri o motivo.

Vou dar continuidade no curso agora. Muito obrigado!

Boa Andrey! Que bom que deu certo!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software