问题标签 [angular-router-guards]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
220 浏览

angular - Angular2+ 如何处理身份验证守卫?

我想知道 Angular 的授权检查流程是什么样的。假设我有以下身份验证保护(实现CanActivate接口的类):

  • 异步isLoggedGuard返回Observable
  • 异步isNotBannedGuard返回Promise
  • 同步isUncompletedGuard(返回 a boolean

和定义如下的路线:

  1. 将如何处理?是否会一次调用所有警卫?
  2. 有没有什么好的方法可以让它是连续的,所以在给出真值isUncompletedGuard后会检查守卫 isLoggedGuard
0 投票
1 回答
590 浏览

angular - 如何解析包装在可观察对象中的本地数据,然后在 Angular+ 中用远程替换数据

我在做什么:

我的路线上有一个有角度的决心守卫/work/:slug。我想立即使用本地数据的 Observable 解决该守卫,同时通过网络获取远程数据。网络请求成功后,将本地数据替换为远程。

笔记:

  • 我的本地数据tombstoneDefault.data只是一个 javascript 数组。
  • 我使用 Observable.from() 来包装我的本地数据。
  • 我的网络请求this.someService.getData()将返回一个 Observable。

问题,我如何链接[Observable.from][1]我的研究导致我使用switchMap或者我如何使用 RXJS 中的不同运算符来完成这个?

在此处输入图像描述

0 投票
4 回答
21456 浏览

angular - Angular 4 Multiple Guards - 执行顺序

我在应用程序中有 2 个警卫,AuthGuard 和 AccessGuard。AuthGuard顾名思义就是保护所有的页面,把session对象存储在GlobalService中,AccessGuard依赖于AuthGuard在GlobalService中存储的session对象中的一些访问数据。

当 AuthGuard 返回一个 Observable 然后同时执行 AccessGuard 以检查尚未到达的会话对象并且代码中断时,就会出现问题。有没有其他方法可以限制 AccessGuard 的执行,直到会话对象到达或任何其他解决方法来打破这种竞争条件?

#Note我没有将 AccessGuard 逻辑合并到 AuthGuard,因为只有一些路由需要检查访问权限,而所有其他路由都需要身份验证。例如,帐户页面和数据库页面可供所有人访问,但用户管理和仪表板需要来自会话对象的外部访问参数

#EDIT:添加警卫代码

身份验证:

AccessableGuard:

#注意: _dataService是存储来自 AuthGuard 的访问权限的 GlobalService。

0 投票
1 回答
776 浏览

angular - 配置 Angular 路由器防护

有什么方法可以配置canActivateAngular 路由器中使用的守卫吗?

有这个SessionGuard

而这条路线:

我想requireLeagues根据路线设置为真或假,而不必创建一个新的、不同的警卫。这可能吗?

0 投票
0 回答
175 浏览

angular - Angular2 CanDeactivate 使用指令而不是组件

是否可以使用CanDeactivate指令而不是组件?

我的实现如下所示,但不起作用:

还有我的路由器:

0 投票
1 回答
2903 浏览

angular - 角。如何使用 Location.back() 使 CanDeactivate 正常工作

我正在我CanDeactivate的一个主要组件中实现功能。为了测试它,我让它总是返回false,所以路线不能改变。

这是返回 PromiseCanDeactivate的调用component.canDeactivate()解析为 false 的实现:

这是定义模块路由的片段:

当我使用back服务的方法Location@angular/common导航到上一页时,有两种不同的情况:

  • 如果之前的位置是由 Angular 路由器管理的,则导航会被阻止,并且应用程序会停留在该组件的路由上,
  • 如果之前的位置在应用程序之外(例如,如果该组件的路由的 url 直接在浏览器导航栏中引入)它会在应用程序之外并加载上一个页面。

即使之前的位置是由路由器管理的,调用location.back()足够多的次数(与应用程序的导航历史长度一样多)也会使导航返回到应用程序启动之前的页面。

这有什么问题?

0 投票
1 回答
807 浏览

angular - 在 AuthGuard 中使用回调函数

如果我在 AuthGuard 中有以下 CanActivate 实现:

守卫会不会等到回调函数执行,知道userInfo下面实际使用HTTP调用Auth0。

0 投票
1 回答
2178 浏览

angular - Angular 2路由器CanActivate如何重定向到404但仍然显示正在访问的url

这是我的场景:

用户访问名为 的路线/protected。在我的 CanActivate 守卫中,我检查用户是否登录。如果他们没有登录,我想渲染我的404路线,但仍显示 /protected在地址栏中。我希望用户无法区分受保护的页面和不存在的页面。

这是我尝试过的,但不起作用。

路由后,地址栏中的url会显示/404,但我希望它显示/protected

更改为this.router.navigate(['/404'], { skipLocationChange: true });也不起作用,因为地址栏中的 url 将是以前的 url,而不是/protected.

我的问题是:如果用户未登录同时仍将他们试图访问的 url 保留在地址栏中,您如何呈现不同的组件?

0 投票
0 回答
3864 浏览

angular - router.navigate 和 router.navigateByUrl 不起作用

我将请求的 URL 保存在本地存储中,重定向到身份服务器,这个重定向回我的根 URL,然后我想导航到以前保存的 URL。

我将网址保存在警卫中:

我正在尝试在我的 app.component.ts 中重定向:

我的路由如下所示:

如果我尝试访问/recent,它将正确存储在本地存储中,console.log 输出正确打印'/recent'但没有导航发生。页面保留在根 url ( '/') 中。

我已经尝试过硬编码网址('/recent''recent')并使用其他功能router.navigate(url)(也尝试过硬编码)。

编辑 用 setTimeout (1000) 包裹导航是可行的……但这不是正确的解决方案

0 投票
1 回答
49 浏览

angular - 如何仅显示我可以在 Angular 中活动的模块的链接?

我将路由器和防护与 CanActivate 一起使用。它工作正常,但我只需要在我的菜单中显示“可激活”链接。

路由器有任何选项作为“isActivable”吗?

例子: