Symfony 4 Voters - 角色和权限问题
Symfony 4 Voters - Roles and Permissions Questions
我开始研究选民系统以保护我的 URL,但我有很多问题。
首先,我不知道我是否必须使用 "Roles" 或 "Permissions"。
"Roles" 我的意思是 Role_User、Role_Manager 等。
"Permissions" 是指 "Access_users"、"Edit_User"、"Add_User" 等
我说得对吗?
如果是,我想检查我的 Voters 中的权限以控制对 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
,但我不知道如何在我的 Voters 中执行此操作。
有关信息,'ROLE_ADMIN' 在我的 security.yaml 配置中设置,但我想让这些角色动态化,以便能够创建角色(并为角色分配权限?) .
在我的 Voter class 中,当我控制一个文档时,我会检查所有者和其他可以管理该文档的用户,但是当我不传递文档时,我真的不知道该怎么做。
只是获取用户的权限并检查请求的权限是否进入他们。
类似的东西:
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 的角度来看它是一样的。
为角色分配权限,无非就是角色层次结构,更多内容在 documentation 中。同样不要忘记,一个用户可以拥有多个角色。
以后我只讲角色
对于动态角色,您的 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];
}
我开始研究选民系统以保护我的 URL,但我有很多问题。
首先,我不知道我是否必须使用 "Roles" 或 "Permissions"。
"Roles" 我的意思是 Role_User、Role_Manager 等。 "Permissions" 是指 "Access_users"、"Edit_User"、"Add_User" 等
我说得对吗?
如果是,我想检查我的 Voters 中的权限以控制对 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
,但我不知道如何在我的 Voters 中执行此操作。
有关信息,'ROLE_ADMIN' 在我的 security.yaml 配置中设置,但我想让这些角色动态化,以便能够创建角色(并为角色分配权限?) .
在我的 Voter class 中,当我控制一个文档时,我会检查所有者和其他可以管理该文档的用户,但是当我不传递文档时,我真的不知道该怎么做。
只是获取用户的权限并检查请求的权限是否进入他们。 类似的东西:
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 的角度来看它是一样的。
为角色分配权限,无非就是角色层次结构,更多内容在 documentation 中。同样不要忘记,一个用户可以拥有多个角色。
以后我只讲角色
对于动态角色,您的 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];
}