前后端访问控制策略共享的最佳实践及实现方案问询
项目组成
我负责的项目包含2个调用后端REST API的前端应用,目前架构较为简单,但很快会演进。
前端:
- Web应用(React)
- 移动端应用(React Native)
后端:
- REST API(基于Ruby RoR)
访问策略问题
背景:
- 前端应用需根据访问策略判断特定用户可展示的UI模块
- 当前采用RBAC+ABAC的混合权限模型
目前缺乏清晰的访问策略管理架构,业务逻辑分散在前后端,引发以下问题:
- 前后端访问策略代码重复(同一条策略的代码可能在代码库的3个不同位置重复)
- 前端条件判断复杂:部分场景下需获取多个实体才能判断用户是否可访问某功能
解决方案/思路
我的初步想法是将访问策略逻辑集中在API端,这样可避免重复,所有规则统一管理,后续新增前端应用或API微服务时也更易扩展。
目前的疑问是:如何在前后端之间共享访问策略?
- 通过API端点暴露此类配置是否为合理的规范?
示例:
route: GET /user/access_policies response : { author: { read: true, create: true, update: false, delete: false }, books: { read: true, create: true, update: true, delete: false, } }
此外,是否可在简单CRUD动词之外暴露特定业务策略:
{ books: { read: true, create: false, update: false, delete: false, deleteOwnBooks: true, // custom business policy (only delete the books owned by the current user) deletePublishedBook: true, // same } }
关于此类访问策略的共享,您是否有其他建议或最佳实践?
更新(2023年12月5日)
我们最终采用了以下方案:在User资源中暴露全局权限。
type User = { id: string permissions: { author: { read: boolean, create: boolean, update: boolean, delete: boolean }, books: { read: boolean, create: boolean, update: boolean, delete: boolean // Your user role allow you to delete books } } }
为实现细粒度资源权限,我们直接在对应资源中暴露权限。
type Book = { id: string name: string permissions: { // Can only delete own books // Can only delete published books delete: boolean } }
目前该模式能很好满足需求,但需注意性能问题,因为会增加额外计算。我们通常通过REST API的专用查询参数,按需查询权限来解决。
内容的提问来源于stack exchange,提问作者Simon Bruneaud
相关产品推荐
相关产品推荐

