我有一个与经过身份验证的用户一起使用的多个应用程序。
所有这些应用程序都可以为不同的客户端一起部署,但具有相同的用户数据库。
例如连锁酒店。
用户的角色信息可在每个请求的标头中找到。
例如,经理在他自己的酒店中拥有完全访问权限,但在另一家酒店中只有阅读权限。
例如:
{
["organization":"paris","roles":[ADMIN,ROOT]],
["organization":"london","roles":[READ]]
}
我如何处理组织的多个级别的角色?
我在symfony中阅读了一些有关选民和角色的文档,但没有阅读有关某种团体中的角色的文件。
答案 0 :(得分:1)
投票是必经之路
// src/Security/PostVoter.php
namespace App\Security;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
class OrganisationVoter extends Voter
{
// these strings are just invented: you can use anything
const READ= 'READ';
const EDIT = 'EDIT ';
protected function supports($attribute, $subject); bool //todo
protected function voteOnAttribute($attribute, $subject, TokenInterface $token)
{
// [...] check class like documentation
$organisation= $subject;
switch ($attribute) {
case self::READ:
return $this->canView($organisation, $user);
case self::EDIT:
return $this->canEdit($organisation, $user);
}
}
private function canView(Organisation $organisation, User $user)
{
//here your logic if your user has the same organisation
}
private function canEdit(Organisation $organisation, User $user)
{
//here your logic if your user has the same organisation than the one in parameter and the good level of right (admin, root)
}
}
然后在您的控制器(或树枝或任何位置)中
if ($this->security->isGranted(OrganisationVoter::EDIT, $organisation)) {
return true;
}
答案 1 :(得分:0)
您所描述的内容已经写满了“基于属性的访问控制”。 abac帮助您将授权与要保护的应用程序/ API外部化/分离。这意味着您可以独立于授权逻辑开发功能。
这里有一些标准-XACML和ALFA(授权的缩写语言)。
这是架构的样子:
上一个答案迫使您实施投票者。这非常脆弱,需要根据需求的变化定期进行编码和更新。在ALFA中,您不需要这样做。您只需要简单地用原始英语编写使用您感兴趣的属性的策略即可。例如: