データベーステーブルuser
に直接バインドされる3つの主な役割があるとしましょう:ROLE_USER
,ROLE_MODERATOR
およびROLE_ADMIN
Symfony 2 - 「別個の」役割に基づくACLチェック許可
でも、Crews
コンポーネント(以下のUMLを参照)に使用される他の役割もあります。 Crew
で実行されるアクションには、以下の役割を使用します。ROLE_CREW_BOSS
、ROLE_CREW_LEFTHAND
、ROLE_CREW_RIGHTHAND
、ROLE_CREW_MEMBER
+----------------+ +------------------+ | users | | crews | |----------------| |------------------| | id | | id | | username <---+ | name | | password | | +---> cash | | roles | | +-------------------+ | | ... | | ... | | | crew_members | | | | | | | |-------------------| | | | +----------------+ | | crew_id +--------------+ | | +----+ user_id | +--------^---------+ | roles | | | ... | +------------+ | | | | | | +------------------+ | | | | forum_topics | | | | |------------------| | | | | id | +-------------------+ +---+ crew_id | | title | | description | | ... | | | | | | | +------------------+
これはその部分がはっきりしていることを希望します。さて、問題は付属しています...
問題
ForumTopic
オブジェクトを作成することができます役割ROLE_MODERATOR
を持つすべてのユーザーではなく、1つは、特定の乗組員のためのプライベートなのでcrew_id
が、設定されている1。また、役割がROLE_CREW_BOSS
,ROLE_CREW_LEFTHAND
またはROLE_CREW_RIGHTHAND
の乗組員(ユーザでもある)だけが、乗組員のフォーラムトピックを編集できます。どのようにこれらの複雑さをチェックするのですか? Voter
とおそらく?
UPDATE 1
私は50%のための問題を解決してきたが、それは固体ではありません。私はオブジェクトEntity\\ForumTopic
に特有の有権者を作成しました。
public function vote(TokenInterface $token, $object, array $attributes)
{
if ($object instanceof ObjectIdentityInterface) {
if ($object->getType() == 'Entity\\ForumTopic') {
/**
* @var Member $member
*/
$member = $token->getUser();
$userTable = new UserTable();
$user = $userTable->getByMember($member);
$userInCrewTable = new UserInCrewTable();
$crewMember = $userInCrewTable->getByUser($user);
if ($crewMember && in_array($crewMember->getRole(), array('boss', 'lefthand', 'righthand'))) {
return self::ACCESS_GRANTED;
}
}
}
return self::ACCESS_ABSTAIN;
}
ここでの唯一の問題は、それぞれの役割を使用していないことです。たとえば、役割階層機能を使用できません。誰でも私の現在のソリューションでより良い解決策または改善点を得ましたか?
ありがとうございます!
ステファン
+1 –
私に教えてください、そのようなrealtion-diagrammsを作成するツールがあります:) –
@ V-Light今私が使用したものが、単にGoogleの "ASCIIダイアグラム"、ex http://asciiflow.com/ –