php-ロールを管理し、ロールにパーミッションを割り当てる-Symfony
ロールとパーミッションに基づいてSymfony3で管理パネルを構築しています。各管理者には役割(または複数のroles)が割り当てられ、その役割に割り当てられた権限に基づいて処理を実行できるようになります。
アイデアを出すために、次の例を示します。
- 管理パネルには、addユーザー、editユーザー、deleteユーザー向けの機能があります。
- ロールを作成しました:
USER_MANAGEMENT_WITHOUT_DELETE
はuser_create
とuser_edit。
user_create
、user_edit
へのアクセス許可を持つUSER_MANAGEMENT_WITH_DELETE
ロールを作成しましたおよびuser_delete
- これで、役割
USER_MANAGEMENT_WITH_DELETE
の管理者はadd
、edit
を実行できますおよびdelete
ユーザー。ロールUSER_MANAGEMENT_WITHOUT_DELETE
の管理者はadd
とedit
ユーザーですが、deleteユーザーはできません。
FOSUserBundleとACLを検索して見つけました。 推奨されるACLもあれば、 FOSUserBunder
を使用する方がよいと言う人もいます。FOSUserBunderのドキュメントと、
a:1:{i:0;s:10:"ROLE_ADMIN";}
roles列にロールを格納する方法も読みました。 >ですが、権限については何も言及されていません。これが私の質問です:- 私は2人の間で混乱しています。どちらを使用すればよいですか?
FOSUserBunder
を使用している場合、権限を管理するにはどうすればよいですか?
答え :
解決策:
ロールはFOSUserBundleに固有のものではありません。彼らはSymfonyにいます。
ACL は、役割を使用するよりも複雑です。したがって、役割を使用することをお勧めします。
Symfonyのドキュメントから: ACLの代替案
ACLの使用は簡単ではありません。より単純なユースケースでは、次のようになります。 やり過ぎ。あなたの許可ロジックが書くだけで説明できるなら いくつかのコード(たとえば、ブログが現在のユーザーによって所有されているかどうかを確認するため)、次に 有権者の使用を検討してください。投票者には、投票対象のオブジェクトが渡されます。 複雑な決定を下し、効果的に実装するために使用できます 独自のACL。承認の実施(例:isGranted部分) このエントリに表示されるものと似ていますが、投票者クラスは ACLシステムではなく、舞台裏でロジックを処理します。
「許可」に対処するには、投票者を使用することをお勧めします:
まず、次のような投票者を作成します:
構成:
# app/config/services.yml services: app.user_permissions: class: AppBundle\Voters\UserPermissionsVoter arguments: ['@security.access.decision_manager'] tags: - { name: security.voter } public: false
そしてクラス:
namespace AppBundle\Voters; use Symfony\Component\Security\Core\Authorization\Voter\Voter; use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; use Symfony\Component\Security\Core\User\UserInterface; class UserPermissionsVoter extends Voter { const USER_CREATE = 'user_create'; const USER_EDIT = 'user_edit'; const USER_DELETE = 'user_delete'; private $decisionManager; public function __construct($decisionManager) { $this->decisionManager = $decisionManager; } protected function supports($attribute, $object) { if (!in_array($attribute, array(self::USER_CREATE,self::USER_EDIT,self::USER_DELETE))) { return false; } return true; } protected function voteOnAttribute($attribute, $object, TokenInterface $token) { $user = $token->getUser(); if (!$user instanceof UserInterface) { return false; } switch($attribute) { case self::USER_CREATE: if ($this->decisionManager->decide($token, array('ROLE_USER_MANAGEMENT_WITH_DELETE')) || $this->decisionManager->decide($token, array('USER_MANAGEMENT_WITHOUT_DELETE')) ){ return true; } break; case self::USER_EDIT: // ... break; case self::USER_DELETE: // ... break; } return false; } }
次に、コントローラーで許可を確認できます:
userCreateAction() { if(!$this->isGranted('user_create')){throw $this->createAccessDeniedException('You are not allowed to create an user.');} // next steps ... }
同様の質問
私たちのウェブサイトで同様の質問で答えを見つけてください。