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 协议 ,转载请注明出处!