身份验证和授权始终是好话题
我将尝试向您解释我们如何处理当前正在使用的多租户服务中的授权。使用JSON Web令牌开放标准,身份验证和授权基于令牌。该服务公开了任何类型的客户端(Web,移动和桌面应用程序)都可以访问的REST API。成功验证用户身份后,服务将提供一个访问令牌,必须在每次请求时将其发送到服务器。
因此,让我介绍一些基于我们如何在服务器应用程序上感知和处理数据的概念。
资源:客户端可以通过服务访问的任何单位或一组数据。我们要为所有要控制的资源分配一个名称。例如,有了下一个端点规则,我们可以将它们命名为:
product
/products
/products/:id
payment
/payments/
/payments/:id
order
/orders
/orders/:id
/orders/:id/products
/orders/:id/products/:id
这么说吧,到目前为止,我们在服务中拥有三种资源:product
,payment
和order
。
动作:可以在资源上执行的操作,例如读取,创建,更新,删除等。不必只是经典的CRUD操作,您可以将一个名为follow
例如,为希望公开使用WebSockets传播某种信息的服务。
能力:action
对resource
。例如; 阅读产品,创建产品等。它基本上只是资源/操作对。但是您也可以为其添加名称和描述。
角色:用户可以拥有的一组功能。例如,一个角色Cashier
可以具有“已读付款”,“创建付款”或某个角色的能力Seller
可以具有能力“读取产品”,“读取订单”,“更新订单”,“删除订单”。
最后,用户可以分配各种角色。
说明
如前所述,我们使用JSON Web令牌,并且用户拥有的功能在令牌的有效载荷中声明。因此,假设我们有一个小型零售商店的用户同时具有出纳员和卖方的角色。有效负载如下所示:
{
"scopes": {
"payment": ["read", "create"],
"order": ["read", "create", "update", "delete"]
}
}
正如您在scopes
声明中看到的那样,我们没有指定角色的名称(出纳员,卖方),而是仅指定了涉及的资源和操作。当客户端向端点发送请求时,服务应检查访问令牌是否包含所需的资源和所需的操作。例如,GET
对端点的请求/payments/88
将成功,但是DELETE
对同一端点的请求必须失败。
当然,您必须将额外的属性添加到有效负载中,以识别发出令牌的用户和客户(租户)。
{
"scopes": {
...
},
"tenant": "acme",
"user":"coyote"
}
使用此方法,您可以微调任何用户帐户对服务的访问。最重要的是,您不必在问题中指出各种预定义和静态角色,例如Admin,Agent和End-Users。一个超级用户将是拥有一个用户role
的所有resources
和actions
分配给它的服务。
现在,如果有100种资源并且我们想要一个可以访问所有或几乎所有资源的角色,该怎么办?我们的令牌有效载荷将是巨大的。这可以通过嵌套资源并仅在访问令牌范围内添加父资源来解决。
授权是一个复杂的主题,必须根据每个应用程序的需求进行处理。
payment:[read]
,卖方有payment: [create]
。在这种情况下,您是否汇总权限?