1
resposta

Redirect baseado no perfil

Paulo,

Estou com um projeto da faculdade e nele eu tenho diferentes perfis de usuário e cada um será redirecionado para sua própria página após a autenticação. Encontrei um post de um blog seu a solução abaixo, porém o redirecionamento não é feito, na verdade após o login ele não redireciona para nenhuma URL. O login é efetuado com sucesso, se eu faço um GET para a URL a requisição é feita perfeitamente.

Fiz alguns testes e vi que o método onAuthenticationSuccess é invocado, porém ele não entra na estrutura condicional para verificar as roles e redirecionar para a página.

Segue o código.

SecurityConfiguration

@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter{

    @Autowired
    private UserRepository repository;

    @Autowired
    private LoginSuccessHandler loginSuccessHanlder;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable().authorizeRequests()
            .antMatchers("/teacher-panel").hasRole("TEACHER")
            .antMatchers("/student-panel").hasRole("STUDENT")
            .anyRequest().authenticated()
            .and().formLogin().loginPage("/login")
            .successHandler(loginSuccessHanlder).permitAll();
        super.configure(http);
    }

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

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

LoginSuccessHandler

@Component
public class LoginSuccessHandler implements AuthenticationSuccessHandler {

    private RedirectStrategy redirect = new DefaultRedirectStrategy();

    @Override
    public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication auth)
            throws IOException, ServletException {

        if (auth.getAuthorities().contains(new Role("ROLE_TEACHER"))) {
            redirect.sendRedirect(request, response, "/teacher-panel");
        } else if (auth.getAuthorities().contains(new Role("ROLE_STUDENT"))) {
            redirect.sendRedirect(request, response, "/student-panel");
        }
    }
}
1 resposta

Você precisa colocar o contexto no redirect... colocando apenas "/" na frente ele redireciona relativo ao localhost:8080/