🏕 参加独立开发者训练营(2021),开发一个完整的应用。了解详情 | 立即报名

重构日记 #2:控制用户能做什么

这两天研究了一下权限控制相关的东西,不管我们想要开发什么样的网站或者应用,控制用户的权限是必须得做的一件事情。 就是我们得在应用里面制定一些规则,规定一下什么样的用户能干什么,不能干什么。这个就是 Authorization。

还有词跟这个挺像的,就是 Authentication,这个词指的是身份验证,就是验证用户的身份,也就是我们得知道使用应用的这个用户是谁。一般在开发应用的时候,先得做这个 Authentication ,因为只有知道用户是谁,才能控制他的权限。做身份验证有挺多种方法,比如现在比较常用的 JWT 就是一种身份验证的方法。咱们在后面可以单独做个视频介绍一下。

先了解一下这个权限控制。比如我想重构的宁皓网这个网站应用,里面应该有管理员,他可以管理应用,基本上就是可以做任何的事情。还有订阅会员,完成订阅的用户可以观看付费的内容。这回重构我还想吸引一些内容的作者,不想单枪匹马了,忒累了。

比如我可以主动联系一些内容作者,或者用户可以申请成功内容作者,成为内容作者以后,可以得到创建内容,上传视频这些权限。

权限控制有不少方法,你比如说有基于角色的,有基于声明的,还有基于属性的,用哪一些得看实际的需求。 RBAC,指的就是基于角色的访问控制,意思就是 Role-Based access control。

这种权限控制的方法就是你可以给应用的用户分配一个用户角色,在宁皓网上应该有几种用户角色,比如 admin 应用的管理员,member 应用的会员,author 内容的作者。这些用户在访问某个功能的时候,可以检查一下用户的用户角色,如果用户拥有指定的用户角色,就让他继续使用他想使用的功能,如果没有功能指定的用户角色就可以拒绝给他提供服务。

这种权限控制比较简单,但是你想要应对比较复杂的权限控制,我们还得再找一些其它的方法。比如 ABAC,Attribute-based access control。这种方法可以让我们做到属性级别的权限控制。你比如说在应用里面有一种内容,内容上面有 title,description,还有 status 这些属性。

你可能想让普通的用户可以更新内容的 title 还有 description 属性,但是只有通过验证的用户,才能更新内容的 status 属性。这种权限控制就比较难搞了,要是纯手写的话,比较复杂。所以我们得找一些方法,去定义还有验证用户的权限。

这次我决定用的是一个叫 CASL 的东西,在 JavaScript,还有 Node.js 项目里面,你可以这个东西去定义还有验证用户的权限。

一开始我没搞明白这个 CASL,因为之前比较固定的思路就是,用户的角色,用户的权限这些东西都得存储在数据仓库里面,然后我就琢磨,这个 CASL 是怎么知道我们的应用的用户,还有用户要访问的东西,还有就是用户拥有的权限。现在我弄明白了。

这个 CASL 其实就是给我们提供了一些定义用户权限还有检查用户权限的方法。比如我们确定了应用的用户的权限以后,你可以用 CASL 提供的方式把这些权限表达出来,就是定义出来,或者叫写出来。然后你在应用里可以使用 CASL 提供的验证权限的方法,来验证指定的用户在做某些事情的时候的权限。

另外这个 CASL 也支持我们把权限存储在数据仓库里,它可以根据对象数据来生成权限规则。有时候一些固化的思路会影响我们的理解,反正当时看 CASL 文档的时候挺懵的,打破这个固化思路,还是得老老实实的动手实践一下。

跟这个 CASL 挺像的,还有 casbin,你的项目要是用的其它的语言,比如 Python,Go 这些,可以考虑一下 Casbin。选择 CASL 是因为它在 npm 的下载量比较高,每周大概有十几万的下载。 另外它还提供了一些在客户端做权限检查的方案,比如在 Vue,React 项目里面,你也可以使用 CASL 提供的方法定义还有检查用户的权限。

今天就先跟大家聊这些吧 ~

相关课程

CASL:权限控制



微信好友

用微信扫描二维码,
加我好友。



微信公众号

用微信扫描二维码,
订阅宁皓网公众号。



240746680

用 QQ 扫描二维码,
加入宁皓网 QQ 群。

统计

13198
分钟
0
你学会了
0%
完成

社会化网络

关于

微信订阅号

扫描微信二维码关注宁皓网,每天进步一点