Symfony 4 投票者 - 角色和权限问题



我开始研究选民系统来保护我的网址,我有很多问题。

首先,我不知道我是否必须使用"角色"或"权限"。

我所说的"角色"是指Role_User、Role_Manager等。 而"权限"是指"Access_users"、"Edit_User"、"Add_User"等。

我说的对吗?

如果是,我想检查我的选民中的权限以控制对 URL 的访问,如果我没有要控制的对象,则为事件。

/**
* @Route("/", name="list")
* @Security("is_granted('ROLE_ADMIN') or is_granted('PERM_ACCESS_SERIES')")
*/
public function list()
{
$series = $this->seriesService->findAll();
return $this->render('backend/series/list.html.twig', [
"series" => $series
]);
}

在这种情况下,我想检查用户是否具有角色ROLE_ADMIN或权限PERM_ACCESS_SERIES,但我不知道如何在我的选民中执行此操作。

有关信息,"ROLE_ADMIN"是在我的 security.yaml 配置中设置的,但我想使这些角色动态化,以便能够创建角色(并为角色分配权限?

在我的 Voter 类中,当我控制文档时,我会检查所有者和其他可以管理文档的用户,但是当我不传递文档时,我真的不知道该怎么做。

只是获取用户的权限并检查要求的权限是否进入他们。 像这样:

if (in_array($attribute, $user->getPermissions())) {
return true;
}

其实这是我的选民

protected function voteOnAttribute($attribute, $subject, TokenInterface $token)
{
//ADMIN and SUPER_ADMIN can do anything they want !
if ($this->decisionManager->decide($token, array(User::ROLE_ADMIN, User::ROLE_SUPER_ADMIN))) {
return true;
}
$user = $token->getUser();
if (!$user instanceof User) {
// the user must be logged in. if not, deny access
return false;
}
$series = $subject;
switch ($attribute) {
case self::PERM_ACCESS_SERIES:
if (in_array($attribute, $user->getPermissions())) {
return $this->canAccess($series, $user);
}
break;
case self::PERM_ADD_SERIES:
if (in_array($attribute, $user->getPermissions())) {
return $this->canAdd($series, $user);
}
break;
case self::PERM_EDIT_SERIES:
if (in_array($attribute, $user->getPermissions())) {
return $this->canEdit($series, $user);
}
break;
case self::PERM_DELETE_SERIES:
if (in_array($attribute, $user->getPermissions())) {
return $this->canDelete($series, $user);
}
break;
default:
throw new LogicException('This code should not be reached!');
break;
}
return false;
}

在每种情况下,我都会检查该属性是否在用户的权限中。

好吧,正如你所看到的,我对角色和权限缺乏很多感觉,所以建议和帮助来组织所有受欢迎的内容。

另外,如果有什么不清楚的地方,请随时告诉我,英语不是我的母语,所以也许我的句子结构不好,完全无法理解。

你说的 角色和权限 以你的方式是一回事。无需区分它们。你可以考虑你的PERM ROLE_ACCESS_SERIES等等,它只是命名/约定的问题,但从Symfony的角度来看,它是相同的。

为角色分配权限,无非是角色层次结构,更多内容在文档中。不要忘记,一个用户可以有多个角色。

从现在开始,我将只谈论角色。

对于动态角色,您的UserInterface对象具有方法getRoles(),该方法不必是静态的,但例如可以从数据库/每个用户所需的任何存储中加载角色。

对于对象签入权限。例如ROLE_LIST_SERIES通常不需要任何对象来检查权限,所以没有对象就可以了,但是例如ROLE_EDIT_SERIES应该始终具有我们正在编辑关联的对象,这意味着如果提供否,我们将抛出异常,这意味着我们缺少某个地方来传递它。

对我来说,如果我们以 CRUD 为例,我将有这样的角色:

ROLE_ENTITY_MASTER:
- ROLE_ENTITY_LIST
- ROLE_ENTITY_EDIT
- ROLE_ENTITY_ADD
# and you continue what you need.

这样做的好处是,例如,如果我想给某人对某些内容的完全访问权限,我只需要分配一个角色,如果我希望某人限制,我只给他我想要的角色。然后在我的getRoles()(实际上我是从数据库加载的,所以这只是伪代码(。

getRoles() {
return [ROLE_ADMIN, ROLE_ENTITY_MASTER2, ROLE_ENTITY_MASTER];
}

最新更新