【问题标题】:how to prevent some users to access some component by manually change the url in angular 2?如何通过手动更改angular 2中的url来防止某些用户访问某些组件?
【发布时间】:2018-03-11 08:47:53
【问题描述】:

我正在使用 Angular 2,我有一个用于呈现数据的数据表和一个重定向到 '/viewOutgoing;id=data_id' 的点击事件。id 是数据表的数据 id。我有一些用户不应该看到其中的所有数据数据表。但是当他们将 URL 更改为 '/viewOutgoing;id=data_id' 时,他们可以看到数据,即使数据对他们来说是禁止的。我该如何处理? 这是component.html:

<ngx-datatable-column prop="title">
<ng-template let-column="column" let-sort="sortFn" ngx-datatable-header-template>
  <span (click)="sort()" class="font">{{'OutgoingTable.Title' | translate}}</span>
</ng-template>
<ng-template let-value="value" let-row="row" ngx-datatable-cell-template>
  <a class="data_font" (click)="showOutgingViewForm(row.id)">{{value}}</a>
</ng-template>

这是component.ts:

showOutgingViewForm(id) {
this.router.navigate(['/viewoutgoing', { id: id }]);
  }

我的一项服务中有一个方法,我需要获取数据来激活路线。我正在使用:

 canActivate() {
    this.authService.get_user_permission().subscribe(perm => {
      if (perm.permission.rows[0].show_all = true) {
        return true;
      } else {
        return false;
      }
    })
  }
}

这就是服务:

get_user_permission() {
    this.createAuthenticationHeaders();
    return this.http.get('/authentication/get_user_permission', this.options).map(res => res.json());
  }

这是 get_user_permission 方法:

    router.get('/get_user_permission/', (req, res) => {
    pool.connect((err, client, done) => {
      if (err) {
        console.log(err);
        res.json({ success: false, message: err});
      } else {
        client.query('select * from get_user_permission($1)', [req.decoded.userId], (err, permission) => {
          done();
          if (err) {
            res.json({ success: false, message: err });
          } else {
            res.json({success: true,permission: permission
            });
          }
        });
      }
    });
  });

但我错了!有什么问题?

【问题讨论】:

标签: angular datatable routing routes


【解决方案1】:

您应该使用[routeGuard][1] 来检查权限。

您的路由模块如下所示。

 path: 'viewoutgoing/:id', component: YourComponent, canActivate: [AuthGuard] },

路由守卫

@Injectable()
export class AuthGuard implements CanActivate {

constructor(private router: Router) {


}

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {

    if (this.if (route.params[id] === 'yourRole') {
       //Do return  true
        return true;
    }


    // not logged in so redirect to login page with the return url
    this.router.navigate(['/login'], { queryParams: { returnUrl: state.url } });
    return false;
}

根据您的评论,您有 多个警卫。你可以在一个场景中尝试这样的事情。

@Injectable()
export class RoleGuard implements CanActivate {

constructor(private _authGuard: AuthGuard) {}

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Promise<boolean> {
    return this._authGuard.canActivate(route, state).then((auth: boolean) => 
  {
        if(!auth) {
           return Promise.resolve(false);
        }
        //... your role guard check code goes here
    });
  }

路由模块

 path: 'viewoutgoing/:id', component: YourComponent, canActivate: [RoleGuard ] },

【讨论】:

  • 你的解决方案很有用,但我已经有一个 authguard 来检查登录用户,我需要一个新的保护来检查用户的权限。你不能帮我创建两个保护吗?我试图这样做,但是当我使用两个并排的守卫时,只有 authGuard 有效
  • @fariba.j 你能把到目前为止你尝试过的内容添加到问题中吗
  • 我解决了这个问题,但我现在有一个新问题!我编辑了这个问题!你能帮我吗?
  • @fariba.j 请显示您使用的路由配置。 canActivate 接受一系列守卫,因此必须通过所有守卫才能成功。由于不同验证的关注点分离,不同保护的要求是有效的,并且由 Angular 支持。你也提到了一些错误,所以也请详细说明。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-15
  • 1970-01-01
相关资源
最近更新 更多