我正在使用RBAC端点开发一个应用程序,该应用程序需要使用RESTful系统进行适当的授权安全性。到目前为止,我已经研究了Keycloak。它一开始看起来很有前途,但不支持端点的粒度授权控制,这是一个困难的需求。例如,如果我有端点/object/<object:id>
、对象I列表( [1,2,3,4]
)和测试用户,就无法限制测试用户只能访问对象I( [1,2]
),而不能访问同一个端点的[3,4]
。用户似乎可以访问所有的It或无It。也许这可以通过定制或扩展基本密钥披风服务器来实现,但是在Keycloak网站上并没有足够的文档说明如何这样做。
我已经搜索过其他RBAC权限系统,但没有找到多少。是否有任何授权系统可以做到这一点?
发布于 2022-06-08 05:25:38
但不支持端点的粒度授权控制。
查看Auth0的细粒度授权解决方案:https://docs.fga.dev/。(免责声明:我受雇于Auth0)。
在您的特定情况下,您需要创建一个授权模型,如
type object
relations
define reader as self
然后使用写API在FGA存储中添加以下元组
(user:test, relation:reader, object:1)
(user:test, relation:reader, object:2)
然后,在您的API中,您将执行如下操作:
const { Auth0FgaApi } = require('@auth0/fga')
const express = require('express')
const app = express()
const fgaClient = new Auth0FgaApi({
storeId: process.env.FGA_STORE_ID, // Fill this in!
clientId: process.env.FGA_CLIENT_ID, // Fill this in!
clientSecret: process.env.FGA_CLIENT_SECRET // Fill this in!
});
app.get('/objects/:id', async (req, res) => {
try {
const { allowed } = await fgaClient.check({
tuple_key: {
user: req.query.user,
relation: 'reader',
object: "object:" + req.params.id
}
});
if (!allowed) {
res.status(403).send("Unauthorized!")
} else {
res.status(200).send("Authorized!")
}
} catch (error) {
res.status(500).send(error)
}
});
const port = 3000
app.listen(port, () => {
console.log(`Example app listening on port ${port}`)
})
https://stackoverflow.com/questions/71961903
复制相似问题