【问题标题】:How can I allow routes to users based on module condition?如何根据模块条件允许用户路由?
【发布时间】:2020-07-31 15:10:00
【问题描述】:

我知道 Angular 中 Auth 守卫的用法,我只是 Angular 的初学者,我刚刚做了一个基于读写访问的基本身份验证,包括 isAdmin 或 Isguest 等角色

但现在我希望特定用户必须只能访问某些路线

就像我有三个模块

  1. 一个组件
  2. B 组件
  3. C 组件

并且上述所有组件可能是子路由,也可能不是子路由。

我希望 harry 用户可以访问模块 A 和 B

Jackson 可以访问模块 B 和 C

Michel 只能访问模块 A

那么如何在 Angular 中构建这种类型的机制呢?

其实我知道 Auth 守卫,但是如何组织数据库中的数据以添加组件列表或其他内容等?

canActivate 中需要添加什么条件?

一个解决方案,如果明天有新组件出现并且我需要访问授权,我需要处理的更少并且是动态的。

欢迎任何好的想法...!!

【问题讨论】:

  • 嗨@enno.void 正是我在寻找如何组织数据库中的数据可能是我需要添加用户可以访问的组件列表 canActivate 内必须是什么条件?我正在寻找一个可靠的解决方案,就好像明天如果有任何其他组件出现我需要做更少的处理来授予访问权限:)

标签: angular angular-ui-router angular8 auth-guard angular-route-guards


【解决方案1】:

您可以为每个路由添加权限并存储每个用户所需的权限。

const routes: Routes = [
  {
    path: 'dashboard',
    loadChildren: () => import('./dashboard/dashboard.module').then(mod => mod.DashboardModule),
    canActivate: [ Guard ],
    data: { permission: 'view dashboard' }
  }

在 canActivate() 中,您可以检查权限是否存在于用户数据中。

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
  if(!route.data || (route.data && this.user.permissions.find(route.data.permission))) {
    return true;
  }
}

【讨论】:

  • 感谢答案,所以您的意思是说,在路线中我只需要添加类似权限属性数据:{权限:'查看仪表板'}并在用户类或界面中说我只需要到权限的主列表,例如权限列表是否包含“查看仪表板”我的意思是该列表是字符串类型,然后允许访问我理解完美吗...?
  • 好的,谢谢,这似乎是最有希望的会尝试让您知道,但是对于子路线,我们该怎么办?顺便说一句,我使用的是 Angular 版本 10,所以在我尝试您的解决方案之前,如果有任何语法更改,您也可以建议我:)
  • 对于子路由,你也可以用同样的方式处理它。我已经在版本 8 中尝试过,但应该也适用于 10 版
  • 当然,这个答案似乎是最有希望的,因为我会批准它,因为我认为没有其他方法比这更有效:) 谢谢..!!
【解决方案2】:

您需要创建一个 Auth Guard,如下所示:

@Injectable()
    export class MyGuard implements CanActivate {
      constructor(private _myUserService: MyUserService) {}
    
      canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
        if(//ADD CONDITION HERE)
            return true;
        return false;
      }
    }

然后在你的路线中,你会得到类似的东西:

{
    path: 'XXX',
    component: XXXComponent,
    canActivate: [MyGuard],
}

【讨论】:

  • 是的,这是知道的,但是我怎样才能像在数据库中那样组织条件我需要放置像用户文档这样的字段和像可以访问模块 A B C 这样的字段我正在寻找确切的答案和确切的条件,如果你能在这方面付出更多的努力,那就太好了..!!
猜你喜欢
  • 1970-01-01
  • 2019-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-06
  • 2022-01-16
  • 2012-05-21
  • 2013-01-22
相关资源
最近更新 更多