问题标签 [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.
angular - Angular2+ 如何处理身份验证守卫?
我想知道 Angular 的授权检查流程是什么样的。假设我有以下身份验证保护(实现CanActivate
接口的类):
- 异步
isLoggedGuard
返回Observable
; - 异步
isNotBannedGuard
返回Promise
; - 同步
isUncompletedGuard
(返回 aboolean
)
和定义如下的路线:
- 将如何处理?是否会一次调用所有警卫?
- 有没有什么好的方法可以让它是连续的,所以在给出真值
isUncompletedGuard
后会检查守卫isLoggedGuard
?
angular - 如何解析包装在可观察对象中的本地数据,然后在 Angular+ 中用远程替换数据
我在做什么:
我的路线上有一个有角度的决心守卫/work/:slug
。我想立即使用本地数据的 Observable 解决该守卫,同时通过网络获取远程数据。网络请求成功后,将本地数据替换为远程。
笔记:
- 我的本地数据
tombstoneDefault.data
只是一个 javascript 数组。 - 我使用 Observable.from() 来包装我的本地数据。
- 我的网络请求
this.someService.getData()
将返回一个 Observable。
问题,我如何链接[Observable.from][1]
我的研究导致我使用switchMap或者我如何使用 RXJS 中的不同运算符来完成这个?
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。
angular - 配置 Angular 路由器防护
有什么方法可以配置canActivate
Angular 路由器中使用的守卫吗?
有这个SessionGuard
:
而这条路线:
我想requireLeagues
根据路线设置为真或假,而不必创建一个新的、不同的警卫。这可能吗?
angular - Angular2 CanDeactivate 使用指令而不是组件
是否可以使用CanDeactivate
指令而不是组件?
我的实现如下所示,但不起作用:
还有我的路由器:
angular - 角。如何使用 Location.back() 使 CanDeactivate 正常工作
我正在我CanDeactivate
的一个主要组件中实现功能。为了测试它,我让它总是返回false
,所以路线不能改变。
这是返回 PromiseCanDeactivate
的调用component.canDeactivate()
解析为 false 的实现:
这是定义模块路由的片段:
当我使用back
服务的方法Location
从@angular/common
导航到上一页时,有两种不同的情况:
- 如果之前的位置是由 Angular 路由器管理的,则导航会被阻止,并且应用程序会停留在该组件的路由上,
- 如果之前的位置在应用程序之外(例如,如果该组件的路由的 url 直接在浏览器导航栏中引入)它会在应用程序之外并加载上一个页面。
即使之前的位置是由路由器管理的,调用location.back()
足够多的次数(与应用程序的导航历史长度一样多)也会使导航返回到应用程序启动之前的页面。
这有什么问题?
angular - 在 AuthGuard 中使用回调函数
如果我在 AuthGuard 中有以下 CanActivate 实现:
守卫会不会等到回调函数执行,知道userInfo
下面实际使用HTTP调用Auth0。
angular - Angular 2路由器CanActivate如何重定向到404但仍然显示正在访问的url
这是我的场景:
用户访问名为 的路线/protected
。在我的 CanActivate 守卫中,我检查用户是否登录。如果他们没有登录,我想渲染我的404
路线,但仍显示 /protected
在地址栏中。我希望用户无法区分受保护的页面和不存在的页面。
这是我尝试过的,但不起作用。
路由后,地址栏中的url会显示/404
,但我希望它显示/protected
。
更改为this.router.navigate(['/404'], { skipLocationChange: true });
也不起作用,因为地址栏中的 url 将是以前的 url,而不是/protected
.
我的问题是:如果用户未登录同时仍将他们试图访问的 url 保留在地址栏中,您如何呈现不同的组件?
angular - router.navigate 和 router.navigateByUrl 不起作用
我将请求的 URL 保存在本地存储中,重定向到身份服务器,这个重定向回我的根 URL,然后我想导航到以前保存的 URL。
我将网址保存在警卫中:
我正在尝试在我的 app.component.ts 中重定向:
我的路由如下所示:
如果我尝试访问/recent
,它将正确存储在本地存储中,console.log 输出正确打印'/recent'
但没有导航发生。页面保留在根 url ( '/'
) 中。
我已经尝试过硬编码网址('/recent'
和'recent'
)并使用其他功能router.navigate(url)
(也尝试过硬编码)。
编辑 用 setTimeout (1000) 包裹导航是可行的……但这不是正确的解决方案
angular - 如何仅显示我可以在 Angular 中活动的模块的链接?
我将路由器和防护与 CanActivate 一起使用。它工作正常,但我只需要在我的菜单中显示“可激活”链接。
路由器有任何选项作为“isActivable”吗?
例子: