[RESOLVIDO] Aplicação Spring MVC não faz o redirecionamento para página correta após login

Olá, Pessoal!

Estou com um problema e gostaria de contar com a valiosa ajuda de vocês para resolvê-lo:

Ao fazer login na minha aplicação preciso ser encaminhando para uma página de listagem de catálogos. O processo de login em si está ok, porém, esse encaminhamento não acontece automaticamente: a página de listagem só está sendo exibida se for informada a sua url diretamente no browser e pressionada a tecla ENTER.

Seguem alguns códigos desenvolvidos até aqui:

SegurancaController.java

//package e imports omitidos

@Controller
public class SegurancaController {

	@GetMapping("/entrar")
	public String realizarLogin(@AuthenticationPrincipal Usuario usuario) {
		if (usuario != null) {
			int usuarioId = (int) usuario.getId();
			
			return "redirect:/usuarios/" + usuarioId + "/catalogos/listar";

		} else
			return "entrar";
	}
}

CatalogoController.java

//package e imports omitidos

@Controller
@RequestMapping("usuarios/{usuarioId}/catalogos")
public class CatalogoController {
//...

    @GetMapping("/listar")
	public ModelAndView listar(@PathVariable("usuarioId") long usuarioId, ModelMap model) {
		model.addAttribute("catalogos", catalogoService.recuperarPorUsuario(usuarioId));
		model.addAttribute("usuarioId", usuarioId);
		
        return new ModelAndView("/catalogo/list", model);
	}
}

SecurityConfig.java

//package e imports omitidos

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
	@Autowired
	private UserService userDetailsService;

	@Autowired
	private PasswordEncoder passwordEncoder;

	@Override
	protected void configure(AuthenticationManagerBuilder auth) throws Exception {
		auth.authenticationProvider(authenticationProvider());
	}

	@Override
	protected void configure(HttpSecurity http) throws Exception {
		http 
			.authorizeRequests()
				.antMatchers("/usuarios/cadastro", "/usuarios/salvar").permitAll()
				.anyRequest().authenticated()
				.and()
			.formLogin()
				.loginPage("/entrar")
				.permitAll();
	}

	@Bean
	public DaoAuthenticationProvider authenticationProvider() {
		DaoAuthenticationProvider provider = new DaoAuthenticationProvider();
		provider.setPasswordEncoder(passwordEncoder);
		provider.setUserDetailsService(userDetailsService);
		return provider;
	}

	@Override
	public void configure(WebSecurity web) throws Exception {
		web.ignoring().antMatchers("/css/**", "/webjars/**");
	}
}

Desde já agradeço a todos que estiverem dispostos a ajudar.

Obrigado!

testa colocando essa / ai no mapeamento. o codigo esta certo. ele direciona para qual pagina? e como fica o endereco no navegador?

Olá thimor!

Muito obrigado pela sugestão, mas mesmo colocando a “/” no mapeamento não funciona. :frowning:

Quando faço login permaneço na página de login ao invés de ser encaminhado para página de listagem.

A minha aplicação só está funcionamento na seguinte condição:

Ao tentar acessar diretamente a página de listagem sem passar pelo login, o spring security me joga para página de login. Então ao fazer o login sou redirecionado automaticamente para a página de listagem.

O que eu preciso é que ao fazer o login (sem ter tentado acessar a página de listagem antes) eu seja encaminhado para a página de listagem.

Alguma sugestão?

Mais uma vez, obrigado até aqui.

Como esta a implementacao desse seu usuario? pq o usuario retornado por esse metodo do spring, é apenas username e password, nao é o usuario do banco de dados. se voce quiser pegar os dados do seu usuario vai ter que fazer algo assim:

public class UsuarioSistema extends User {

	private static final long serialVersionUID = 1L;

	private Usuario usuario;

	public UsuarioSistema(Usuario usuario, Collection<? extends GrantedAuthority> authorities) {
		super(usuario.getLogin(), usuario.getSenha(), authorities);
		this.usuario = usuario;
	}

	public Usuario getUsuario() {
		return usuario;
	}

}

@Service
public class AppUserDetailsService implements UserDetailsService {

	@Autowired
	private Usuarios usuarios;
	
	@Override
	public UserDetails loadUserByUsername(String login) throws UsernameNotFoundException {
		Optional<Usuario> usuarioOptional = usuarios.findByLogin(login);
		Usuario usuario = usuarioOptional.orElseThrow(() -> new UsernameNotFoundException("Usuário e/ou senha incorretos"));
		return new UsuarioSistema(usuario, new HashSet<>());
	}
}


@EnableWebSecurity
@ComponentScan(basePackageClasses = AppUserDetailsService.class)
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {

	@Autowired
	private UserDetailsService userDetailsService;
	
	@Override
	protected void configure(AuthenticationManagerBuilder auth) throws Exception {
		auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
	}
	
	@Override
	public void configure(WebSecurity web) throws Exception {
		web.ignoring()
			.antMatchers("/layout/**")
			.antMatchers("/images/**");
	}
	
	@Override
	protected void configure(HttpSecurity http) throws Exception {
		http.cors();
		http.authorizeRequests()
				.anyRequest().authenticated()
				.and()
			.formLogin()
				.loginPage("/login")
				.permitAll()
				.and()
			.logout()
				.logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
				.and()
			.sessionManagement()
				.invalidSessionUrl("/login");
	}
	
	@Bean
	public PasswordEncoder passwordEncoder() {
		return new Criptografia();
	}

}

@Controller
public class SegurancaController {

	@GetMapping("/login")
	public String login(@AuthenticationPrincipal User user) {
		if (user != null) {
			return "redirect:/";
		}
		
		return "login";
	}
	
	@GetMapping("/403")
	public String acessoNegado() {
		return "403";
	}
	
}


tenta criar um outro redireciomento, alguma coisa apenas como / acredito que seu codigo deve estar retornando alguma exception.

	@GetMapping("/entrar")
	public String realizarLogin(@AuthenticationPrincipal Usuario usuario) {
		if (usuario != null) {
			return "redirect:/usuarios/" + usuario.getUsuario().getId() + "/catalogos/listar";
		} 
	        return "entrar";
	}

Olá, agradeço pela ajuda e peço desculpas pelo atraso na resposta, pois precisei me ausentar devido a alguns problemas.

O problema com a minha aplicação foi resolvido da seguinte forma:

Adicionei uma página principal, pela qual o usuário tem acesso as demais páginas do sistema. Caso o usuário não esteja logado ao tentar acessar outra página, lhe é apresentada a tela de login. Ao fazer o login ele é então encaminhado para a página correta. Com essa alteração já foi possível resolver o problema.

Mais uma vez agradeço a sua atenção e disposição em ajudar.

Obrigado!