加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Angular Route Guards:或者vs.和

发布时间:2020-12-17 17:03:30 所属栏目:安全 来源:网络整理
导读:我正在努力使用路线保护来保护我的Angular应用程序的前端.在过去与他们合作并在线研究时,为路由添加多个防护要求所有这些防护都返回true以允许访问. 但是如果我只想让一个返回true以允许访问呢? (比如||而不是) 例如,我的路线保护在用户的令牌中查找某些角
我正在努力使用路线保护来保护我的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并更新您的逻辑以相应地处理…此时有很多选项,但我认为您不需要帮助.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读