Я начал работать над системой голосования, чтобы защитить свои URL-адреса, и у меня есть много вопросов.
Во-первых, я не знаю, нужно ли мне работать с «ролями» или «разрешениями».
Под «ролями» я подразумеваю что-то вроде 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, но я хотел бы сделать эти роли динамическими, чтобы иметь возможность создавать роли (и назначать разрешения для роли?).
В моем классе избирателя, когда я контролирую документ, я проверяю владельца и других пользователей, которые могут управлять документом, но когда я не передаю документ, я действительно не знаю, что делать.
Просто получите разрешения пользователя и проверьте, есть ли у них запрашиваемое разрешение. что-то подобное :
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;
}
В каждом случае я проверяю, находится ли атрибут в разрешениях пользователя.
Что ж, как видите, мне не хватает понимания ролей и разрешений, поэтому советы и помощь в организации всего, что можно приветствовать.
Кроме того, если что-то неясно, не стесняйтесь сказать мне, английский - не мой родной язык, поэтому, возможно, мои предложения плохо построены и совершенно непонятны.