0

我有下一个 Angular Guard:

export class AdminGuard implements CanActivate {
  constructor(
    private readonly router: Router,
    private readonly userService: UserService
  ) { }

  canActivate(
    next: ActivatedRouteSnapshot,
    state: RouterStateSnapshot): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree {

      return this.userService.getUserRoles().pipe(
        map(roles => {
          if (roles.admin) {
            return true
          }

          this.router.navigate(['/'])
          return false
        })
      )
  }
}

这是来自服务的方法,它返回 Observable:

  public getUserRoles(): Observable<any> {
    return this.store.pipe(
      select('user'),
      map(({ roles }) => roles)
    )
  }

这在我在页面之间导航时有效,但是当我直接在 URL 中输入某些路由时,例如“myapp.com/admin”,它会自动返回 false,并且防护不起作用。如何让它正常工作?

4

1 回答 1

0

最好的猜测是,直接在浏览器中输入 url 时,您将重新启动应用程序,并且商店将重置为没有用户的默认设置。

您应该重写您的getUserRoles()方法以在读取角色之前检查用户是否已通过身份验证,而不仅仅是读取存储状态。例如,如果您使用的是 OAuth2,这会将用户重定向到您的身份验证端点,并在myapp.com/admin重新身份验证握手完成并填充存储后传递适当的状态以在路由上恢复。

这在很大程度上取决于您使用的身份验证方法。

于 2020-05-05T23:20:45.327 回答