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

Falha no login, sou direcionado para a uma página http://localhost:8080/login?error e não efetuo login

Fiz os passos descritos na aula mas não consigo efetuar login de forma alguma. Sou direcionado a mesma página de login mas com um "?error". Não aparece nada no console, tanto do Eclipse quanto se eu usar o comando inspecionar do Chrome.

WebSecurityConfig

package br.com.alura.mvc.mudi.security;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
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.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
        .authorizeRequests()
        .antMatchers("/css/**", "/js/**")
        .permitAll()
        .and()
        .authorizeRequests()
        .anyRequest()
        .authenticated()
        .and()
        .formLogin(
                form -> form
                        .loginPage("/login")
                        .permitAll()
        );

    }

    @Bean
    @Override
    protected UserDetailsService userDetailsService() {
        UserDetails user =
             User.withDefaultPasswordEncoder()
                .username("root")
                .password("root")
                .roles("ADM")
                .build();

        return new InMemoryUserDetailsManager(user);
    }
}

LoginController:

package br.com.alura.mvc.mudi.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class LoginController {

    @GetMapping
    @RequestMapping("/login")
    public String login() {
        return "login";
    }

}

login.html:

<!DOCTYPE html>
<html>
    <head th:replace="~{base :: head}"></head>
    <body>
        <div th:replace="~{base :: logo}"></div>
        <div class="container">
            <div th:replace="~{base :: titulo('Login')}"></div>
            <div class="card mb-3">
                <form th:action="@{/login}" method="POST" class="card-body">
                    <div class="form-group mb-3">
                        <div class="mb-2">
                            <label for="username">Usuário</label>
                            <input name="username" class="form-control" placeholder="usuário"/>
                        </div>
                        <div class="mb-2">
                            <label for="password">Senha</label>
                            <input type="password" name="username" class="form-control" placeholder="senha"/>
                        </div>
                        <button class="btn btn-primary" type="submit">Login</button>
                    </div>                    
                </form>
            </div>
        </div>
    </body>
</html>
1 resposta
solução!

Detectei o problema, no meu input do password, o atributo "name" dele tava "username" e não "password". Me sinto burro por demorar um dia inteiro pra descobrir que foi um erro desse tipo. Mas tá valendo, programador que nunca teve um erro assim nunca programou na vida.

Mas vale ressaltar que demorei bastante pra saber que o erro era isso devido ao fato do Spring não acusar que tipo de erro tava dando, sendo simplesmente redirecionado pra página do login e nem mesmo no console do Eclipse ou no console do Chrome ter aparecido alguma coisa. Precisei fazer algumas modificações pra poder entender o que aconteceu:

@GetMapping
    @RequestMapping("/login")
    public String login(HttpServletRequest request, Model model) {
        HttpSession session = request.getSession(false);
        String errorMessage = null;
        if (session != null) {
            AuthenticationException ex = (AuthenticationException) session
                    .getAttribute(WebAttributes.AUTHENTICATION_EXCEPTION);
            if (ex != null) {
                errorMessage = ex.getMessage();
                return "redirect:/login-error";
            }
        }
        System.out.println("--->" + errorMessage);
        model.addAttribute("errorMessage", errorMessage);
        return "login";
    }

Assim pude ver no console o erro, que era "usuário não existente ou senha inválida", e então assumir que o erro estava no .html, que com a ajuda do StackOverflow (porque se for esperar pra algum professor ajudar a gente nesse fórum...) pude detectar exatamente onde estava o erro.

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