Angular Route Guards:或者vs.和
我正在努力使用路线保护来保护我的Angular应用程序的前端.在过去与他们合作并在线研究时,为路由添加多个防护要求所有这些防护都返回true以允许访问.
但是如果我只想让一个返回true以允许访问呢? (比如||而不是&&) 例如,我的路线保护在用户的令牌中查找某些角色: @Injectable() export class ActiveRoleGuard implements CanActivate { constructor(private sessionService: SessionService,private router: Router) { } canActivate(route: ActivatedRouteSnapshot,state: RouterStateSnapshot): boolean { let token = this.sessionService.getToken(); if (!token) { return false; } if (token.role.toLowerCase().indexOf("active") < 0) { this.router.navigate(["/issue"]); return false; } return true; } } 和 @Injectable() export class AdminRoleGuard implements CanActivate { constructor(private sessionService: SessionService,state: RouterStateSnapshot): boolean { let token = this.appSessionService.getToken(); if (!token) { return false; } if (token.role.toLowerCase().indexOf("admin") < 0) { this.router.navigate(["/issue"]); return false; } return true; } } 如果我在路由器模块中将它们正常组合,那就像…… {path:“someroute”,component:SomeComponent,canActivate:[ActiveRouteGuard,AdminRouteGuard]} …但这需要用户既是活动又是管理员.但是,如果我想强制执行A??ctive和管理员或经理,该怎么办? 像这样在API上执行很简单: [Authorize(Roles = "Active")] [Authorize(Roles = "Admin,Manager")] public class SomeController : ApiController 但我如何在Angular中做到这一点? 解决方法
您可以只使用可以“配置”的单个版本,而不是拥有两个单独的CanActivate实现.为此,您可以利用
Route 的数据属性.例如,在您的路线中,您可以执行以下操作:
{ path: "someroute",component: SomeComponent,canActivate: [RoleRouteGuard],data: { requiredRoles: ["Role1","Role2","Role3"] } } 使用它,您可以采用现有的CanActivate实现之一,并使其更通用.您可以通过ActivatedRouteSnapshot从数据访问requiredRoles属性.例如: canActivate(route: ActivatedRouteSnapshot,state: RouterStateSnapshot): boolean { const requiredRoles = route.data.requiredRoles; .... 一旦你有了这个,你可以检查令牌的角色是否在数组等等. 如果您具有始终需要的Active角色,然后是一个Admin或Manager角色,则还可以将其扩展为具有多个数据属性.例如,您可以使用requiredRoles和atOastOneOfRoles并更新您的逻辑以相应地处理…此时有很多选项,但我认为您不需要帮助. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |