2014-05-21 2 views
5

나는 시스템을 구축하고 유권자와 ACL 사이를 결정하려고합니다. 달성해야 할 일은 객체 속성에 액세스하는 다른 역할을 가진 사용자가 있어야한다는 것입니다. 예를 들어 정규 인증 된 사용자는 게시물과 내용을 볼 수 있지만 "위치"속성은 볼 수 없으며 편집자 역할을 가진 사용자는 게시물과 그것은 내용이고, "위치"속성을보고 편집 할 수있는 권한이 있습니다. 유권자 만 사용하여이 기능을 구현할 수 있습니까, 아니면 ACL을 사용해야합니까?symfony2 유권자 또는 acl

편집 :

내가 혼란 질문에 대해, 내가 심포니에 새로 온 사람과 아직은 그 개념을 이해하지 않습니다 죄송합니다. 달성 할 수없는 것은 개체 필드 수준에서 사용 권한입니다. enter image description here

일반 사용자는 "TITLE"와 "콘텐츠"속성에 액세스하고, "CONTENT"속성 "을 수정, 중재자 볼 수 있으며 편집, 이전의 속성 모두와 관리자가 모든 개체 속성에 액세스 할 수 있고,해야 할 수 있습니다

답변

11

문서는 속성이 아닌 개체의 액세스를 확인하는 방법 만 설명합니다. 내가 선택한 결정에 대해 설명하겠습니다. 유권자 또는 ACL 중에서 선택할 때. 다음으로 (Hierachy) 유권자를 통해 목표를 달성하는 방법에 대해 설명하겠습니다. 사용자가 단순히이 나 역할에 따라 객체에 대한 액세스 권한이없는 경우


  1. 는 액세스가 방화벽을 사용하여 수행하고 간단한 솔루션입니다 수 있습니다.

  2. 그러나 액세스가 특정 규칙에 따라 개체 단위로 결정되는 경우 유권자를 사용해야합니다. 예를 들어 사용자는 게시물을 만들 때만 수정할 수 있습니다. 그러나 운영자는 항상 게시물을 편집하는 데 철저해야합니다.

  3. 가장 어려운 액세스 제어는 사용자에게 다른 사용자가 액세스 권한을 부여 할 수있는 경우입니다. 예를 들어, 관리자는 사용자를 게시물에 할당하고 편집 권한을 부여 할 수 있습니다. 이것은 사용자의 역할에 따라 액세스를 결정할 수없는 솔루션입니다. 개체에 대해 사용자별로 액세스/사용 권한을 저장해야합니다. 이것은 ACL이하는 일입니다. 사용자 당 데이터베이스의 개체에 대한 사용 권한을 저장합니다.

문제에 관해서는

. 대부분 이러한 종류의 사용은 코드 자체에서 처리됩니다. 엔티티에 대해 여러 가지 형식을 많이 보았습니다. UserPostFormType, ModeratorPostFormTypeAdminPostFormType. 보시다시피 이것은 매우 건조하지 않습니다. 코드의 사용자 유형을 확인하십시오.

계층 구조를 사용하여 역할을 정의하고 관리하는 것이 좋습니다.

조치 당 속성마다 별도의 역할을 정의하십시오. 따라서 다음 역할을 정의하십시오.

ROLE_ID_VIEW 
ROLE_ID_EDIT 
ROLE_TITLE_VIEW 
ROLE_TITLE_EDIT 
... 

그런 다음이 역할을 올바른 사용자 역할에 할당 할 수 있습니다.

security: 
    role_hierarchy: 
     ROLE_USER:  [ROLE_TITLE_VIEW, ROLE_CONTENT_VIEW, ROLE_CONTENT_EDIT] 
     ROLE_MODERATOR: [ROLE_USER, ROLE_TITLE_EDIT] 
     ROLE_ADMIN:  [ROLE_MODERATOR, ROLE_ID_EDIT, ROLE_ID_VIEW] 

계층 적 유권자를 사용하여 사용자가 특정 속성을 수정하거나 볼 수 있는지 확인할 수 있습니다. 가장 깨끗한 해결책은 현재 사용자가 가지고있는 권한을 기반으로 폼에 필드를 추가하는 Listener 폼을 만드는 것입니다.

+0

고마워, 나는 (사용자 역할을 만들지 만 개별 필드없이) 비슷한 방식으로이 문제를 해결했다. . 당신의 대답이 더 합리적입니다. –

-1

유권자는 루트 액세스와 관련이 있지만 ACL 관심은 객체 읽기/쓰기 액세스이므로 다른 사람과는 아무 상관이 없습니다.

+4

[Symfony docs] (http://symfony.com/doc/current/cookbook/security/acl.html)에서 "ACL을 사용하는 것이 간단하지 않으며 간단한 사용 사례 (...)로 유권자를 생각해보십시오 . " – albertedevigo

+0

경로에 개체 ID가 포함되어있을 때 사용자가 개체에 액세스 할 수 있는지 확인하기 위해 유권자를 사용합니다. 게다가 당신이 유권자에게 물건을 건네 줄 수는 없으므로이 일을 할 수없는 이유를 모르겠다. ... –