Nest 中的 权限控制

ACL

即:访问控制表(Access Control List)

代码:nest-study\acl-test

有的接口除了需要登录外,还需要权限。只有登录用户有调用该接口的权限才能正常访问。它的特点是用户直接和权限关联。

用户和权限是多对多关系,在数据库中会存在用户表、权限表、用户权限中间表。

登录的时候,把用户信息查出来,放到 session 或者 jwt 返回。

然后访问接口的时候,在 Guard 里判断是否登录,是否有权限,没有就返回 401,有的话才会继续处理请求。

我们采用的是访问接口的时候查询权限的方案,通过 handler 上用 SetMetadata 声明的所需权限的信息,和从数据库中查出来的当前用户的权限做对比,有相应权限才会放行。

但是这种方案查询数据库太频繁,需要用 redis 来做缓存。

当然,你选择登录的时候把权限一并查出来放到 session 或者 jwt 里也是可以的。

RBAC

基于角色的权限控制 (Role Based Access Control)

代码 nest-study\rbac-test

相比于 ACL (access control list)的方式,多了一层角色,给用户分配角色而不是直接分配权限。

通过 jwt 实现了登录,把用户和角色信息放到 token 里返回。

添加了 LoginGuard 来做登录状态的检查。然后添加了 PermissionGuard 来做权限的检查。

LoginGuard 里从 jwt 取出 user 信息放入 request,PermissionGuard 从数据库取出角色对应的权限,检查目标 handler 和 controller 上声明的所需权限是否满足。

LoginGuard 和 PermissionGuard 需要注入一些 provider,所以通过在 AppModule 里声明 APP_GUARD 为 token 的 provider 来注册的全局 Gard。

然后在 controller 和 handler 上添加 metadata 来声明是否需要登录,需要什么权限,之后在 Guard 里取出来做检查。

这种方案查询数据库也比较频繁,也应该加一层 redis 来做缓存。

当然,这是 RBAC0 的方案,更复杂一点的权限模型,可能会用 RBAC1、RBAC2 等,那个就是多角色继承、用户组、角色之间互斥之类的概念,会了 RBAC0,那些也就是做一些变形的事情。绝大多数系统,用 RBAC0 就足够了。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!