可以通过服务调用激活守卫
CanActivate guard with service call
我有一个要求,我需要根据角色激活路由。请在下面找到代码:
canActivate(): boolean {
if(this.login_token) {
this._Service.getUser(this.login_token).subscribe(
(data) => {
if(data.role === 'admin') {
return true;
}
});
} else {
return false;
}
}
并且我已经配置了如下所示的路线:
{path: 'user', children: childRoutes, canActivate: [AuthGuard]}
但即使我的守卫 return 为真,我仍然无法路由到 user
路由。
如果我在这里做错了什么,请告诉我。我已经探索了很多关于 SO 的帖子来处理警卫中的异步调用,但仍然没有成功
您在每次路由更改时都进行 http 调用?
不要。
当你的前端有一个令牌时,最好是
- 测试令牌是否有效
- 发出请求,让后端解码令牌。
如果您在每次路由更改时都进行 http 调用,这不仅会降低您的应用程序的速度,而且移动数据用户将不得不为这些调用付费,他们不会喜欢这样。
你应该做的是:
canActivate(): boolean {
return this.login_token ? true : false;
}
如果您的后端正在处理错误的令牌,或者
canActivate(): boolean {
try {
return this.isTokenValid();
} catch(error) {
return false;
}
}
isTokenValid(): boolean {
// Test if token exists
// Decode token
// Check if token is not expired
// return a boolean stating if it succeed
}
如果您的后端不处理令牌(但它应该如此...)
我有一个要求,我需要根据角色激活路由。请在下面找到代码:
canActivate(): boolean {
if(this.login_token) {
this._Service.getUser(this.login_token).subscribe(
(data) => {
if(data.role === 'admin') {
return true;
}
});
} else {
return false;
}
}
并且我已经配置了如下所示的路线:
{path: 'user', children: childRoutes, canActivate: [AuthGuard]}
但即使我的守卫 return 为真,我仍然无法路由到 user
路由。
如果我在这里做错了什么,请告诉我。我已经探索了很多关于 SO 的帖子来处理警卫中的异步调用,但仍然没有成功
您在每次路由更改时都进行 http 调用?
不要。
当你的前端有一个令牌时,最好是
- 测试令牌是否有效
- 发出请求,让后端解码令牌。
如果您在每次路由更改时都进行 http 调用,这不仅会降低您的应用程序的速度,而且移动数据用户将不得不为这些调用付费,他们不会喜欢这样。
你应该做的是:
canActivate(): boolean {
return this.login_token ? true : false;
}
如果您的后端正在处理错误的令牌,或者
canActivate(): boolean {
try {
return this.isTokenValid();
} catch(error) {
return false;
}
}
isTokenValid(): boolean {
// Test if token exists
// Decode token
// Check if token is not expired
// return a boolean stating if it succeed
}
如果您的后端不处理令牌(但它应该如此...)