【问题标题】:MERN stack authentication and authorizationMERN堆栈认证和授权
【发布时间】:2019-07-03 00:55:50
【问题描述】:
我正在创建一个 MERN(Mongo、Express、React-redux、Node)堆栈应用程序,我正在其中添加身份验证、授权和访问控制功能。我知道如何实现身份验证服务,但不知道如何实现授权和访问控制。例如:当用户登录时,他将能够在他的仪表板上创建、编辑和删除待办事项,并且没有人能够看到或编辑它。我该如何实施?任何链接、代码或帮助将不胜感激。非常感谢!
【问题讨论】:
标签:
node.js
react-redux
authorization
access-control
mern
【解决方案1】:
这是一个很好的问题。答案很长 :-) 我刚刚回复了一个类似的问题here so you could start reading that。
TL;DR
您正在寻找的是所谓的外部化/动态授权管理。正式模型称为基于属性的访问控制 (abac / Wikipedia)。它由Nat'l Institute of Standards & Technology (NIST) 正式化。
更深入
你说:
当用户登录后,他将能够在他的仪表板上创建、编辑和删除待办事项,并且没有人能够看到或编辑它。
您需要使用属性编写策略,允许用户执行此类操作并阻止他们执行其他操作。如果我们重写你的需求,它变成:
- 用户可以在他们拥有的仪表板上创建、编辑和删除 TODO 项。
- 任何人都无法在仪表板上查看不属于他们的项目。
查看要求,您意识到您有:
- 主题(或用户)及其属性(例如角色、部门...)
- 一个动作(例如查看、编辑、删除...)
- 对象或资源(“TODO”项)及其容器(仪表板)。
这意味着您可以开始根据属性重写您的需求。这变成:
A user can do action == "view" on object of type == "TODO" if user.username == object.dashboard.owner
然后你可以添加:
deny all access if object.dashboard.owner != user.username
编写此类策略的语言称为 ALFA(alfa / Wikipedia,授权的缩写语言。这是由 OASIS XACML 定义的标准。
定义策略后,您需要部署、运行和执行它们。这就是 ABAC 架构发挥作用的地方:
- 策略管理点 (PAP):编写策略的位置
- 策略决策点 (PDP):运行/执行策略的位置
- 策略执行点 (PEP):执行策略的位置 - 这可能是 API 网关、拦截器...
- 策略信息点 (PIP):可以检索其他元数据和属性的位置
那么问题就变成了:你想在哪里执行?您的 MERN 架构是什么样的?是否要授权:
- 在 Web UI 中? (功能性身份验证)
- 在 API 层(事务性 authZ)
- 在数据层(以数据为中心的 authZ / 过滤)
例如,您想过滤来自 MongoDB 的数据并只显示允许的结果吗?是否要在 API 层应用授权? API 网关(例如 Kong)可以通过授权插件帮助您实现这一目标,例如Axiomatics-Kong.
还有开源和商业 ABAC 实现以及标准机构(我是一些规范的编辑,例如 JSON/REST 请求/响应)