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

Forçar requisição sincrona

Olá pessoal, tudo bem?

Na empresa em que trabalho estou desenvolvendo uma aplicação em angular e há uma regra de negocio em que determinadas paginas podem ser acessadas ou não, variando de acordo com o perfil do usuário (Administrador, coordenador, etc). Para validar isso criei uma API do tipo post que recebe o usuário e a rota que deseja acessar, retornando um true or false após as validações. Não sei se fiz da melhor maneira, mas coloquei a chamada dessa API no arquivo app-routing.module.ts com o parâmetro "CanActivate:[]". Até ai está ok, porém nos testes que fiz consegui acessar diversas vezes rotas que não deveria. Identifiquei que isso ocorre devido o método estar dando o retorno antes da requisição http concluir. Já tentei colocar um thread sleep para forçar esperar o retorno e não funcionou.

Classe chamada pelo CanActivate:

  canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {

    var rota:string = route.url.toString();

    if(this.accountService.isAllowed(rota)){
        console.log("Rota permitida!");     
        return true;
    }else {
        console.log("Rota não autorizada!"); 
      return false;
    }
  } 

Chamada da API:

  isAllowed(rota:string){

    var tk:string = window.localStorage.getItem('token');

    var validationForm = {
      token:tk,
      subModulo:rota
    };

    var isAllowed:Boolean = false;

    this.http.post<any>(`${environment.api}/api/user/validarPermissao`, validationForm).subscribe(x =>{
      isAllowed = x;
    });

    return isAllowed;
  }

Conseguem me ajudar?

1 resposta
solução!

Acho que consegui melhorar esta validação. Coloquei as paginas que usuário tem acesso no token, e quando ele tenta acessar determinada pagina o canActivate verifica no token se o usuário tem acesso ou não. Porém fiquei com uma nova duvida, eu salvo o token no local storage, algum usuário mal intencionado não poderia gerar um token novo em outro lugar colocando acesso a alguma pagina que ele não deveria?