Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Login redirecionando para a própria tela de login na primeira vez

Olá a todos.

Na aula 4 do curso Spring MVC 2, eu implementei o logout do sistema via GET. Sempre que eu acesso a URL "http://localhost:8080/casadocodigo/logout", o logout acontece e sou redirecionado automaticamente para a tela de login "http://localhost:8080/casadocodigo/login". Até aqui OK, mas o problema é que nesse momento se eu realizo o login, sou autenticado, mas não sou redirecionado para a página home, mas sim para login novamente. O interessante é que na URL de login está adicionado um "?logout" no final e se eu tento logar novamente eu sou levado para a home. Quando sou redirecionado para a página de login eu sei que estou autenticado porque eu consigo acessar as URLs que eu não teria permissão.

Por que esse redirecionamento incorreto ocorre?

Abaixo está o código da minha classe SecurityConfiguration

@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter{

    @Autowired
    private UsuarioDAO usuarioDao;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        /**
         * Método para criar as regras de permissão ao sistema.
         * 
         * Sequência das permissões: primeiro bloqueia e depois vai liberando o que é necessário.
         */
        http.authorizeRequests()
            .antMatchers("/resources/**").permitAll()
            .antMatchers("/carrinho/**").permitAll()
            .antMatchers("/pagamento/**").permitAll()
            .antMatchers("/produtos/form").hasRole("ADMIN")
            .antMatchers(HttpMethod.POST,"/produtos").hasRole("ADMIN")
            .antMatchers(HttpMethod.GET,"/produtos").hasRole("ADMIN")
            .antMatchers("/produtos/**").permitAll()
            .antMatchers("/").permitAll()
            .anyRequest().authenticated()
            .and().formLogin().loginPage("/login").permitAll()
            .and().logout().logoutRequestMatcher(new AntPathRequestMatcher("/logout"));
    }

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

Abaixo está a JSP da página de login

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>


<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Livros de Java, Android, iPhone, Ruby, PHP e muito mais - Casa do Código</title>
    <c:url value="/resources/css" var="cssPath" />
    <link rel="stylesheet" href="${cssPath}/bootstrap.min.css" />
    <link rel="stylesheet" href="${cssPath}/bootstrap-theme.min.css" />
    <style type="text/css">
        body{
            padding: 60px 0px;
        }
    </style>
</head>
<body>
    <div class="container">
        <h1>Login Casa do Código</h1>
        <form:form servletRelativeAction="/login" method="post">
            <div class="form-group">
                <label>Nome</label>
                <input type="text" name="username" class="form-control" />
            </div>
            <div class="form-group">
                <label>Senha</label>
                <input type="password" name="password" class="form-control" />
            </div>
            <button type="submit" class="btn btn-primary">Logar</button>
        </form:form>
    </div>
</body>
</html>

Se quiserem analisar mais alguma coisa, eu subi o meu projeto no GitLab. Segue link do projeto: https://gitlab.com/MauryOshiro/projeto-curso-spring-mvc-2-alura---casa-do-codigo.git

1 resposta
solução!

Acabei encontrando o meu erro.

Dentro do método configure da classe SecurityConfiguration faltou adicionar a chamada do método logoutSuccessUrl("/login").

O método configure precisa ficar da seguinte forma:

protected void configure(HttpSecurity http) throws Exception {
        /**
         * Método para criar as regras de permissão ao sistema.
         * 
         * Sequência das permissões: primeiro bloqueia e depois vai liberando o que é necessário.
         */
        http.authorizeRequests()
            .antMatchers("/resources/**").permitAll()
            .antMatchers("/carrinho/**").permitAll()
            .antMatchers("/pagamento/**").permitAll()
            .antMatchers("/produtos/form").hasRole("ADMIN")
            .antMatchers(HttpMethod.POST,"/produtos").hasRole("ADMIN")
            .antMatchers(HttpMethod.GET,"/produtos").hasRole("ADMIN")
            .antMatchers("/produtos/**").permitAll()
            .antMatchers("/").permitAll()
            .anyRequest().authenticated()
            .and().formLogin().loginPage("/login").permitAll()
            .and().logout().logoutRequestMatcher(new AntPathRequestMatcher("/logout")).logoutSuccessUrl("/login");
    }

Na página do vídeo dessa aula não tem a adição da chamada do método logoutSuccessUrl(). Na verdade até no vídeo ocorreu esse problema rsrs. Mas na tela de atividade tem a chamada do método.