我已经阅读了一些关于基于角色的访问控制的文章,但是对于处理这种情况还不够清楚:如何实现“用户可以删除自己的帖子”?
对于普通的角色和权限,当用户做某事时,我可以检查用户是否拥有角色和权限,判断用户是否可以做。
但是对于“用户可以删除自己的帖子”,我必须检查帖子是否属于他。所以我必须硬编码一些东西,然后它就脱离了控制系统的控制。
我是否错过了什么以及如何正确地做到这一点?
我已经阅读了一些关于基于角色的访问控制的文章,但是对于处理这种情况还不够清楚:如何实现“用户可以删除自己的帖子”?
对于普通的角色和权限,当用户做某事时,我可以检查用户是否拥有角色和权限,判断用户是否可以做。
但是对于“用户可以删除自己的帖子”,我必须检查帖子是否属于他。所以我必须硬编码一些东西,然后它就脱离了控制系统的控制。
我是否错过了什么以及如何正确地做到这一点?
我并不完全清楚您要解决什么问题。你总是必须“硬编码”一些东西,因为你需要定义谁可以访问什么。如果您决定它应该在控制系统中,那么它也不会超出控制系统,这实际上取决于您的实施。
对于您要执行的操作,我通常会定义一个“所有者”角色,然后定义一个访问权限,例如:
"owner" can "delete" "resource"
因此,必须有一些程序化部分,您可以在其中找出用户是否确实是所有者。通常,这可以通过将每个资源与例如“ownerId”属性相关联来完成。如果 userId == ownerId,则当前用户的角色是“所有者”。
这需要 RBAC 层对“业务规则”的支持。当这种情况可用时,它会为您提供所需的动态决策。基本上,biz 规则是每次检查权限时运行的一段代码。此代码是静态的,但希望将参数传递给它。这是一个示例(显示 PHP):
// This code expect two given parameters: $params['owner_id'] and $params['user_id']
if ($params['owner_id'] == $params['user_id']) {
return true;
}
return false;
// This code assumes that returning true means 'permission granted' and returning
// false means permission not granted
你没有说明你的底层技术。这可以帮助您获得更准确的答案。