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

Redirecionando para login

O ultimo trecho da video aula 6, personalizando o login / logout, ao efetuar o logout e login, o sistema redireciona para login, o ideal seria para Home. Como posso fazer esse procedimento, uma vez que não há um loginSucess para direcionar dentro da SecurityConfiguration?

8 respostas

opa, o legal é que da pra fazer isso de forma fácil. Aqui o trecho de código:

formLogin().loginPage("/login").defaultSuccessUrl("/home")

Não deu certo, ao clicar em sair, faço o logout, ao realizar o login novamente, ele direciona para login.

Segue os controllers homecontroller, login e logout, e a classe security.

    @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").permitAll()
        .antMatchers("/produtos/**").permitAll() // o que vier para frente **
        .antMatchers("/").permitAll() // permite acessar a home
        .antMatchers("/resources/**").permitAll()
        .anyRequest().authenticated() // toda requisição vai verificar se está autenticado
        .and().formLogin().loginPage("/login").permitAll().defaultSuccessUrl("/")
        .and().logout().logoutRequestMatcher(new AntPathRequestMatcher("/logout")); // se nao tiver vai soliciar o login;
    }

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


package br.com.casadocodigo.loja.controllers;

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

@Controller
public class LogoutController {

    @RequestMapping(value="/logout", method = RequestMethod.GET)
    public String logout(){
        return "logout";
    }
}


package br.com.casadocodigo.loja.controllers;

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

@Controller
public class LoginController {

    @RequestMapping(value="/login", method=RequestMethod.GET)
    public String loginForm(){
        return "loginForm";
    }
}

package br.com.casadocodigo.loja.controllers;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import br.com.casadocodigo.loja.Daos.ProdutoDao;
import br.com.casadocodigo.loja.models.Produto;

@Controller
public class HomeController {

    @Autowired
    private ProdutoDao produtoDao;

    @RequestMapping("/")
    @Cacheable(value = "produtoHome")
    public ModelAndView index() {
        List<Produto> produtos = produtoDao.listar();
        ModelAndView modelAndView = new ModelAndView("home");
        modelAndView.addObject("produtos", produtos);
        return modelAndView;
    }

}

Então vc precisa implementar a interface LoginSuccessHandler. Implementa ela e passa o objeto criado como argumento na configuração.

Coloquei a solução de contorno abaixo:

@Controller
public class LoginController {

    @RequestMapping(value="/login", method=RequestMethod.GET)
    public String loginForm(){
        return "loginForm";
    }

    @RequestMapping(value="/logout", method = RequestMethod.GET)
    public String logout(HttpSession session){
        session.invalidate();
        return "redirect:login";
    }
}

Funcionou, ai retirei o logout da classe SecurityConfiguration.

Vou implementar essa interface. vlw.

E ai Fabrício conseguiu fazer o redirecionamento? Poderia me mostrar sua implementação?

Não consegui fazer funcionar estendendo a interface salientado pelo Alberto, fiz da seguinte forma e funcionou:

  @RequestMapping(value="/logout", method = RequestMethod.GET)
    public String logout(HttpSession session){
        session.invalidate();
        return "redirect:login";
    }
solução!

Eu sem precisar maperar "/logout" em LoginController, meu codigo ficou o seguinte no SecurityConfiguration.java:

@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("/arquivos-sumario/**").permitAll()
        .antMatchers("/resources/**").permitAll()
        .antMatchers("/").permitAll()
        .anyRequest().authenticated()
        .and().formLogin().loginPage("/login").permitAll().defaultSuccessUrl("/")
        .and().logout().logoutSuccessUrl("/login").logoutRequestMatcher(new AntPathRequestMatcher("/logout"));
    }