Как лениво загрузить функциональный модуль после того, как пользователь получит соответствующую авторизацию - PullRequest
0 голосов
/ 23 апреля 2020

В нашем приложении у нас есть функциональный модуль администратора, который мы пытаемся загружать лениво, убедившись, что пользователь аутентифицирован и имеет соответствующие роли.

Таким образом, если пользователь непосредственно набирает {root url} / admin , нам нужно сначала проверить, есть ли вошедший в систему пользователь, и если да, проверить, есть ли у пользователя правильные роли и только потом загрузить модуль. В случае неудачной первой проверки, когда пользователь еще не вошел в систему, пользователь должен быть направлен на страницу входа. При входе в систему снова выполняется такая же проверка ролей, и если она прошла, загрузите модуль или перенаправьте пользователя на страницу пользователя.

Что я пробовал до сих пор -

  1. Создание защиты, которая реализует как canLoad, так и canActivate. Но перенаправление из canLoad не работает. Применяется охранник на маршруте {root url} / admin . Вот как canActivate и canLoad выглядит в охране

      canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean | UrlTree {
        if (this.contextSvc.isAuthorized()) return this.contextSvc.isAuthorized()
        else
          return this.router.createUrlTree(["/login"], { queryParams: { returnUrl: state.url } });
      }
    
      canLoad(route: import("@angular/router").Route, segments: import("@angular/router").UrlSegment[]): boolean | Observable<boolean> | Promise<boolean> {
        if (this.contextSvc.isAuthorized()) {
          if(this.contextSvc.isUserAdmin()) return true;
          else {
            this.router.navigateByUrl('/user');
            return false;
          }
        } else {
          this.router.navigateByUrl('/login');
          return false;
        }
      }
    }
    

В этом случае перенаправление «входа» изнутри canLoad не работает

Я также пытался использовать дочерний подход с пустым путем, в котором защита canActivate была установлена ​​на родительском маршруте, а защита canLoad была установлена ​​на дочернем пути с пустым путем. Но похоже, что распознаватель маршрутов работает снизу.

Как я понимаю, это было бы довольно распространенным явлением во многих приложениях, но я не смог найти конкретного решения. Любая помощь?

...