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

[Dúvida] E como fazer para configurar uma página de login na versão StateFull?

Eu estou desenvolvendo uma aplicação com o spring boot 3, mas com SSR. Ativei o spring security, porém queria personalizar a tela de login. Como eu faço isso? Achei meio confuso a documentação. Se alguém tiver links de materiais ou puder me explicar bem certinho eu agradeço :)

2 respostas
solução!

Oi!

Aqui tem um exemplo de configuração de segurança para uma aplicação Web tradicional:

@Configuration
@EnableWebSecurity
public class SecurityConfigurations {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        return http
                .authorizeHttpRequests(req -> {
                    req.requestMatchers("/admin/**").hasRole("ADMIN");
                    req.requestMatchers("/login", "/login/**").permitAll();
                    req.anyRequest().authenticated();
                })
                .formLogin(form -> {
                    form.loginPage("/login").defaultSuccessUrl("/");
                })
                .logout(logout -> {
                    logout.logoutUrl("/logout");
                })
                .build();
    }

    @Bean
    public WebSecurityCustomizer webSecurityCustomizer() {
        return (web) -> web.ignoring().requestMatchers("/css/**", "/js/**", "/img/**", "/webfonts/**", "/*.png", "/*.ico", "/error");
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

}

Repare nesse trecho que indica a url da página de login, qual a url a ser chamada após o login ser processado com sucesso e qual url chamada realiza o logout:

.formLogin(form -> {
    form.loginPage("/login").defaultSuccessUrl("/");
})
.logout(logout -> {
    logout.logoutUrl("/logout");
})

Você precisa ter um controller que mapeia a url de login e de logout:

@Controller
@RequiredArgsConstructor
public class LoginController {

    public static final String LOGIN_PAGE = "login/login";

    @GetMapping("/login")
    public String carregarFormularioLogin(@AuthenticationPrincipal Usuario logado) {
        if (logado != null) {
            return "redirect:/";
        }

        return LOGIN_PAGE;
    }

    @PostMapping("/logout")
    public String efetuarLogout(HttpSession session) {
        session.invalidate();
        return "redirect:/login";
    }

}

Repare que a página de login está mepeada na constante e aponta para: login/login, ou seja, a págian de login deve estar em: src/main/resources/templates/login/login.html

Bons estudos!

Entendido, muito obrigado!