我正在制作一个包含一些受保护页面的应用程序此页面仅供注册用户访问。有时我应检查会话超时或更改浏览器选项卡后。如果用户已在其他选项卡或会话中退出,则应用程序应将用户重定向到登录页面。
我正在使用警卫来保护页面,所以我认为通过警卫检查当前路线的正确方法。如果用户会话已过期/已关闭且当前路由使用某些警卫,则应重定向页面。
有人可以帮助获得当前路线的守卫吗?
我检查了Router和ActivatedRoute的文档,但没有找到任何相关的信息。
答案 0 :(得分:2)
我面临完全相同的问题。 这是一个更好地理解需求的场景。 想象一下,你有一个网站,其中一些页面受到保护,有些页面没有。警卫用于保护适当的页面。现在想象用户是在受保护的页面上(让我们说是查看个人资料)并点击“退出”#39;按钮。应该怎么办?应将用户重定向到主页。但是,如果用户位于不受保护的页面上,则不应该发生任何事情。当然,如果重定向应该发生,那么可以在每个签名页面上检查它,但它不是最好的解决方案。一个更好的解决方案是在AuthService中处理这种情况,其中注销是实际发生的,但是有人需要知道当前活动的路由是否受到保护的保护。
答案 1 :(得分:2)
我也面临这个问题。所以我做了一些研究和摆弄并开发了这个解决方案:
假设AuthService的实现方式与https://angular.io/guide/router#canactivate-requiring-authentication相同。
在AuthService中添加以下内容:
Logout() {
// (logout logic here)
var currentRouteConfig = this.router.config.find(f=>f.path == this.router.url.substr(1));
if(currentRouteConfig != null && currentRouteConfig.CanActivate != null) {
this.redirectUrl = this.router.url;
this.router.navigate(['/login'])
}
substr(1)只删除前导'/',因为路由器配置中的路径没有它。
请记住,假设canActivate始终实施身份验证保护,这是一个天真的实现。其他逻辑可能需要更深入地检查身份验证保护。
答案 2 :(得分:0)
我在公司的身份验证库中实现了此解决方案 ,您可以在服务中实现此功能,并在任何地方使用以检查当前路线是否已实现您的后卫
function hasGuard(guardTypeArray: string[], guardName: string) {
const currentRouteConfig = this.router.config.find(f => f.path === this.router.url.substr(1));
let hasGuard = false;
if (currentRouteConfig) {
for (const guardType of guardTypeArray) {
if (!hasGuard) {
if (currentRouteConfig[guardType] ) {
for (const guard of currentRouteConfig[guardType]) {
if (guard.name === guardName) {
hasGuard = true;
break;
}
}
}
} else {
break;
}
}
}
return hasGuard;
}
// Calling it
const check = hasGuard([
'canActivate',
'canActivateChild'
], 'AuthGuardService');
答案 3 :(得分:0)
您可以将runGuardsAndResolvers: 'always'
放入路由配置中,然后只需尝试重新加载路由(类似this.router.navigate([], {relativeTo: this.route })
,其中route
是ActivatedRoute
的组件实例)。