user
: ROLE_USER
, ROLE_MODERATOR
및 ROLE_ADMIN
에 직접 바인딩되는 3 가지 주요 역할이 있다고 가정 해 봅니다.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
을 가진 모든 사용자,하지만 그 중 하나가 특정 승무원 개인이기 때문에 crew_id
가 설정되어 하나. 또한 역할이 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 diagram "ex http://asciiflow.com/ –