我有3个表:Profile - Permission - ProfilePermissionValue
Profile和Permission是经典实体,ProfilePermissionValue是Profile.id,Permission.id和表示配置文件权限值的额外字段的关联。
当我添加一个Permission时,我希望在ProfilePermissionValue中为每个Profile添加一个新行。 反过来相同,当我添加一个新的配置文件时,......顺便删除时也一样。
问题:是否有办法使用Doctrine(Symfony 3)功能,或者我需要自己编写代码?
答案 0 :(得分:1)
我认为你看一下权限< - >比你应该更严格的配置文件。基本上在我工作的几乎每一个ACL中都有一个假设 - 当不允许某些东西时,它被禁止(或者当不允许某些东西被允许时更加危险)。这显着减少了数据量,您必须保存。
所以当你创建像这样的实体时
<?php
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity()
*/
class Permission
{
// id column
/**
* @ORM\Column(type="string")
* @var string
*/
private $name;
/**
* @return string
*/
public function getName()
{
return $this->name;
}
}
和
<?php
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity()
*/
class User
{
// id column
// name column
/**
* @ORM\ManyToMany(targetEntity=Permission::class)
* @ORM\JoinTable(name="allowed_permissions",
* joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="permission_id", referencedColumnName="id")}
* )
* @var Permission[]|Collection
*/
private $allowedPermissions;
/**
* @return Permission[]
*/
public function getAllowedPermissions()
{
return $this->allowedPermissions->toArray();
}
}
您可以简单地为接口AuthorizationCheckerInterface实现自己的类
<?php
use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
class Authorizator implements AuthorizationCheckerInterface
{
/**
* @param string $name
* @param User $user
* @return bool
*/
public function isGranted($name, $user)
{
foreach ($user->getAllowedPermissions() as $permission) {
if ($permission->getName() === $name) {
return TRUE;
}
}
return FALSE;
}
}
无需在数据库中拒绝权限。