路由卫士:如何根据服务器发送的列表使路由卫士为真? [英] Route Guard: How to make route guard true based on list sent by the server?

查看:86
本文介绍了路由卫士:如何根据服务器发送的列表使路由卫士为真?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试在我的应用程序中使用路由防护,只有在服务器向您发送一些参数时,该路由防护才能让您进入组件.

I was trying to use route guard in my app that should let you go to a component only if the server sends you some parameters.

这是服务器可以发送给我的参数列表(并非每次都发送所有参数)

This is the list of the parameters that the server can send me (not all of them are sent each time)

  AGREEMENTS_VIEW 
  PROSPECTS_VIEW
  AGREEMENTS_INSERT_UPDATE
  PRODUCTS_INSERT_UPDATE
  PROSPECTS_INSERT_UPDATE
  DOCUMENTS_VIEW
  DOCUMENTS_INSERT_UPDATE

我的路线守卫:

@Injectable()
export class UserRouteAccessService implements CanActivate {
    userActions=[];
    constructor(private router: Router, private securityService:CralSecurityService) {
     }
     securityActions(){debugger;
        this.securityService.securityActions().subscribe(
           (res: Array<actions>) => {
             this.userActions = res;
             console.log(res);

           });
       }


    canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
        this.securityActions();

        if (this.userActions = actions ) {
            return true;
        } else {
            return false;
        }
    }

现在,当发送某些参数时,我如何才能知道它是否为真?是正确的userActions = []吗?例如,当AGREEMENTS_VIEW时,它应该转到"true" PROSPECTS_VIEW已发送.

Now how can I tell in the if that its true when some of the paramenters are sent or not? is userActions=[] correct? For example it should go to "true" when AGREEMENTS_VIEW PROSPECTS_VIEW are sent.

还可以吗?

export class actions{
          AGREEMENTS_VIEW :string;
          PROSPECTS_VIEW :string;
          AGREEMENTS_INSERT_UPDATE :string;
          PRODUCTS_INSERT_UPDATE :string;
          PROSPECTS_INSERT_UPDATE :string;
          DOCUMENTS_VIEW :string;
          DOCUMENTS_INSERT_UPDATE :string;
}

Http帖子:

Http post:

securityActions(): <Array<any>> {
    return this.http.post<Array<any>>(
        `${this.ENDPOINT}/security-actions`,
        null,
    );
}

推荐答案

接口的签名如下:

interface CanActivate {
  canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean
}

这意味着您可以返回一个返回布尔值的HTTP调用.

This means you can return an HTTP call that returns a boolean.

所以您可以这样写:

authorized = [
  'AGREEMENTS_VIEW',
  'PROSPECTS_VIEW',
  'AGREEMENTS_INSERT_UPDATE',
  'PRODUCTS_INSERT_UPDATE',
  'PROSPECTS_INSERT_UPDATE',
  'DOCUMENTS_VIEW',
  'DOCUMENTS_INSERT_UPDATE',
];

securityActions(): Observable<boolean> {
  return this.securityService.securityActions().pipe(
    map(response => this.authorized.includes(response))
  );
}


canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {
  return this.securityActions();
}

这篇关于路由卫士:如何根据服务器发送的列表使路由卫士为真?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆