как аутентифицировать и авторизовать на каждом уровне маршрута в angular 4 с помощью keycloak - PullRequest
0 голосов
/ 25 февраля 2019

Я интегрировал Keycloak с нашим приложением. Процессы входа и выхода работают правильно, за исключением одного сценария. Я хотел аутентифицироваться, а затем авторизовать каждый маршрут.Потому что, когда пользователь очищает сеанс браузера или очищает сеанс из консоли администратора keycloak, когда пользователь пытается получить доступ к другому маршруту, он говорит 401, так как я написал AppGuard.Я попытался проверить getKeycloakInstance (), он возвращает тот же объект, когда имеет действительный сеанс и после истечения срока сеанса также.Затем я попытался вызвать init (config) из canActive () AuthGuard, он постоянно зацикливался.Как пройти аутентификацию на уровне маршрута.

app-routing.module.ts

{
    path: '',
    canActivate: [AppAuthGuard],
    data: {
            path:'/idam/*'
    },
    loadChildren: './idam/idam.module#IdamModule'
},

app-auth-guard.ts

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Promise<boolean> {
    if (!this.keycloakService.getIsClientSecretKeyFetch()) {
      this.errorHandler._enlivenErrorhandler.handleError({"status":"401","message" :"Unable to get client details. Please contact your administrator ","url":window.location.href});
      this.router.navigate(['404'], { queryParams: { tenantId: this.cookieService.get('tenantId') } });
    }
    return super.canActivate(route, state);
  }

  isAccessAllowed(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Promise<boolean> {
    return new Promise((resolve, reject) => {

      if (!this.authenticated) {
        this.keycloakAngular.login();
        return;
      }

      const path = route.data.path;
      this.keycloakService.isAuthorized(path).then(
        (res) => {
          let access = res;
          if (access) {
            resolve(true);
          } else {
            resolve(false);
          }
        });
      resolve(true);
    });
  }

1 Ответ

0 голосов
/ 25 февраля 2019

В Auth Guard, если сеанс уже существует, мы можем проверить токен, отправив запрос к защищенному ресурсу Keycloak с токеном в заголовке. Если ответ 401, мы можем перенаправить маршрут на страницу входа.Я сделал это так:

URL:

http://Keycloakurl/auth/realms/{realm}/protocol/openid-connect/userinfo
...