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);
}
}
Muito obrigado pela sugestão, mas mesmo colocando a “/” no mapeamento não funciona.
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.
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.
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.