Angular Route Guards:或者vs.和

前端之家收集整理的这篇文章主要介绍了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;
    }
}@H_502_16@ 
 

@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;
    }
}@H_502_16@ 
 

如果我在路由器模块中将它们正常组合,那就像……

{path:“someroute”,component:SomeComponent,canActivate:[ActiveRouteGuard,AdminRouteGuard]}

…但这需要用户既是活动又是管理员.但是,如果我想强制执行A​​ctive和管理员或经理,该怎么办?

像这样在API上执行很简单:

[Authorize(Roles = "Active")]
[Authorize(Roles = "Admin,Manager")]
public class SomeController : ApiController@H_502_16@ 
 

但我如何在Angular中做到这一点?

解决方法

您可以只使用可以“配置”的单个版本,而不是拥有两个单独的CanActivate实现.为此,您可以利用 Route的数据属性.例如,在您的路线中,您可以执行以下操作:

{
    path: "someroute",component: SomeComponent,canActivate: [RoleRouteGuard],data: {
        requiredRoles: ["Role1","Role2","Role3"]
    }
}@H_502_16@ 
 

使用它,您可以采用现有的CanActivate实现之一,并使其更通用.您可以通过ActivatedRouteSnapshot从数据访问requiredRoles属性.例如:

canActivate(route: ActivatedRouteSnapshot,state: RouterStateSnapshot): boolean {
    const requiredRoles = route.data.requiredRoles;
    ....@H_502_16@ 
 

一旦你有了这个,你可以检查令牌的角色是否在数组等等.

如果您具有始终需要的Active角色,然后是一个Admin或Manager角色,则还可以将其扩展为具有多个数据属性.例如,您可以使用requiredRoles和atOastOneOfRoles并更新您的逻辑以相应地处理…此时有很多选项,但我认为您不需要帮助.

猜你在找的Angularjs相关文章