ABAC 权限对读和写的作用不同
ABAC Permissions don't work the same for read and write
我目前正在查看 FaunaDB 创建示例目标跟踪器(待办事项!)应用程序。使用 graphQL,我将模式创建为:
type Goal {
title: String!
completed: Boolean!
owner: User!
}
type User {
name: String!
username: String! @unique
}
input GoalInput {
title: String!
completed: Boolean!
}
我想将 ABAC 权限设置为:
- 登录用户可以查看自己创建的目标。
- 登录用户只能编辑自己创建的目标。
角色权限设置为:
{
resource: Collection("Goal"),
actions: {
read: Query(
Lambda("goalRef", Equals(Select(["data", "owner"], Get(Var("goalRef"))), Identity()))
),
write: Query(
Lambda("goalRef", Equals(Select(["data", "owner"], Get(Var("goalRef"))), Identity()))
)
}
}
虽然 read
部分效果很好,但 write
部分效果不佳。 updateGoal
(由 FaunaDB 自动创建的变异)不断抛出权限不足的错误。
只需上传您提供的架构,这里是 GoalInput
生成的:
input GoalInput {
title: String!
completed: Boolean!
}
如果无法使用 owner
字段创建新目标,则无法查询它们 -- owner
将是 null
尝试更新您的架构以包含用户的目标字段,以获得您正在寻找的一对多关系。 (fauna docs)
type User {
name: String!
username: String! @unique
goals: [Goal] @relation
}
然后确保每次创建新目标时,都将所有者设置为您自己。
交替使用函数
您可以为 createGoalForMe
创建一个自定义变更,它会自动将所有者字段设置为您。
确保为新函数授予 call
权限。
检查权限
写入权限 lambda 接收 newData 和 oldData 作为参数。
/*...*/
{
resource: Collection("Goal"),
actions: {
/*...*/
write: Query(
Lambda(
["oldData", "newData"],
And(
Equals(Identity(), Select(["data", "owner"], Var("oldData"))),
Equals(
Select(["data", "owner"], Var("oldData")),
Select(["data", "owner"], Var("newData"))
)
)
)
)
},
/*...*/
}
/*...*/
所以将 "goalRef"
更改为 ["oldData", "newData"]
,我认为你应该拥有它。
我目前正在查看 FaunaDB 创建示例目标跟踪器(待办事项!)应用程序。使用 graphQL,我将模式创建为:
type Goal {
title: String!
completed: Boolean!
owner: User!
}
type User {
name: String!
username: String! @unique
}
input GoalInput {
title: String!
completed: Boolean!
}
我想将 ABAC 权限设置为:
- 登录用户可以查看自己创建的目标。
- 登录用户只能编辑自己创建的目标。
角色权限设置为:
{
resource: Collection("Goal"),
actions: {
read: Query(
Lambda("goalRef", Equals(Select(["data", "owner"], Get(Var("goalRef"))), Identity()))
),
write: Query(
Lambda("goalRef", Equals(Select(["data", "owner"], Get(Var("goalRef"))), Identity()))
)
}
}
虽然 read
部分效果很好,但 write
部分效果不佳。 updateGoal
(由 FaunaDB 自动创建的变异)不断抛出权限不足的错误。
只需上传您提供的架构,这里是 GoalInput
生成的:
input GoalInput {
title: String!
completed: Boolean!
}
如果无法使用 owner
字段创建新目标,则无法查询它们 -- owner
将是 null
尝试更新您的架构以包含用户的目标字段,以获得您正在寻找的一对多关系。 (fauna docs)
type User {
name: String!
username: String! @unique
goals: [Goal] @relation
}
然后确保每次创建新目标时,都将所有者设置为您自己。
交替使用函数
您可以为 createGoalForMe
创建一个自定义变更,它会自动将所有者字段设置为您。
确保为新函数授予 call
权限。
检查权限
写入权限 lambda 接收 newData 和 oldData 作为参数。
/*...*/
{
resource: Collection("Goal"),
actions: {
/*...*/
write: Query(
Lambda(
["oldData", "newData"],
And(
Equals(Identity(), Select(["data", "owner"], Var("oldData"))),
Equals(
Select(["data", "owner"], Var("oldData")),
Select(["data", "owner"], Var("newData"))
)
)
)
)
},
/*...*/
}
/*...*/
所以将 "goalRef"
更改为 ["oldData", "newData"]
,我认为你应该拥有它。