Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

finalizar compra com erro e falha de redirecionamento ao implementar SpringSecurity

Ola, bom dia, segui as aulas ate a ultima e estava testando a aplicação quando precebi que ao clicar no botao finalizar compra sou redirecionado para a tela de login. Depois de fazer login a aplicação me redireciona para a tela de cadastro de produtos. O comportamento correto seria que eu fosse redirecionado para uma tela de login, ate ai tudo bem, mas depois eu nao deveria voltar para a tela de itens para que ai, quando eu clicasse no botão, finalizar compra, acontecesse o redirecionamento para /pagamento/finalizar ?

Segue meu SecurityConfiguration

@Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .antMatchers("/produtos/form").hasRole("ADMIN")
            .antMatchers(HttpMethod.POST,"/produtos").hasRole("ADMIN")
            .antMatchers(HttpMethod.GET,"/produtos").hasRole("ADMIN")
            .antMatchers("/carrinho/**").permitAll()
            .antMatchers("/produtos/detalhe/**").permitAll()        
            .antMatchers("/usuarios/**").hasRole("ADMIN")
            .antMatchers("/resources/**").permitAll()
            .antMatchers("/arquivos-sumario/**").permitAll()
            .antMatchers("/").permitAll()
            .anyRequest().authenticated()
            .and().formLogin().loginPage("/login").permitAll()
            .and().logout().logoutRequestMatcher(new AntPathRequestMatcher("/logout"));
    }

Código que redireciona para finalizar compra


 <form:form action="${s:mvcUrl('PC#finalizar').build() }">
                          <input type="submit" class="checkout" name="checkout" value="Finalizar compra" />
                      </form:form>

E código que deveria ser executado:

@Controller
@RequestMapping("/pagamento")
@Scope(value=WebApplicationContext.SCOPE_REQUEST)
public class PagamentoController {

    @Autowired
    private CarrinhoCompras carrinho;

    @Autowired
    private RestTemplate restTemplate;


    @RequestMapping(value="/finalizar")
    public Callable<ModelAndView> finalizar(RedirectAttributes att){
        return ()->{
            String uri = "http://book-payment.herokuapp.com/payment";


            String response = "Compra nao efetuada!!!. Erro ao finalizar a compra";
            try {
                response = restTemplate.postForObject(uri, new DadosPagamento(carrinho.getTotal()), String.class);
                System.out.println("Total da compra: " + response);
            } catch (HttpClientErrorException e) {

            }
        att.addFlashAttribute("mensagem", response);
        return new ModelAndView("redirect:/produtos");        

        };
            }
}

Entao basicamente são dois pontos, 1º que o redirecionamento não esta acontecendo como devria ser, ao inves de voltar para a tela de itens ele volta para o cadastro de produto 2º o finalizar compra, depois de logado retorna um erro http 500, mas, funcionava normalmente antes implementar o springSecurity

1 resposta
solução!

O Spring Security tenta voltar para a última url que você tentou acessar, isso realmente acontece. Só olhando assim o código não da para dizer o motivo dele para ir para a tela de cadastro em vez de ir para a tela de listagem de carrinho. É uma implementação interna dele mesmo... O que você pode fazer é fixar a url de redirect pós login...

Em relação ao erro 500, é necessário mais detalhes... O catch que está ali vazio, tenta imprimir a stacktrace da exception.