2014-11-10 2 views
0

yii2 내에서 레코드 수준에서도 RBAC 액세스 제어가 필요합니다. yii2 초보자로서 나는 논리에 들어가기 가장 좋은 점을 찾고 있지만 문서를 통해 고민하고 있습니다.레코드 레벨을 기준으로 Yii2 인증

예 :

  • 다른 어린이 많은 외에하는 아이을 언급어린이 테이블입니다.
  • 어린이는 보통 부모 두 명의 테이블 부모의입니다.
  • yii2-admin/user를 통한 다른 액세스 제어 외에도이 두 부모는 자신의 자식/레코드의 레코드를보고 조작 할 수 있지만 다른 레코드는 조작 할 수 없습니다.
  • 로그인 한 사용자가 상위입니다.

예 테이블 어린이 :

|id|name|age| 
|1|Max|10| 
|2|Moritz|11| 
|3|Lena|8| 
... 

예 테이블 부모 :

|id|relation|name| 
|1|mother|Anna| 
|2|father|Paul| 
|3|mother|Lisa| 
... 

예 테이블 외부 참조 어린이부모- (관계) :

|child_id|parent_id| 
|1|1| 
|1|2| 
|2|3| 
|3|1| 
|3|2| 
... 

은 내가 액티브 클래스 어린이 바로 그런 행동에 대한 적절한 장소가 될 것 같아? Paul과 Anna가 'Max'에 대한 레코드를 수정할 수 있지만 'Moritz'에 대한 레코드는 수정하지 못하도록 효과적인 코드에 대한 올바른 방향을 알려주는 예제 코드가 있습니까?

+0

일반적으로 레코드 레이어에 RBAC를 사용하는 것은 좋지 않은 디자인으로 간주됩니다. 귀하의 경우에는'ActiveRecord' 메소드가 있어야만 사용자'id'를 매개 변수로 사용하고 자식을 리턴합니다. RBAC 수준 필터링 (쓰기 /보기 가능 여부)은 컨트롤러 수준에 있어야합니다. –

+0

나는 팁에 감사하고 동의한다. yii의 초보자 (프로그래밍 초보자는 아님)로서 신발에 들어가기위한 코드 조각을 물어보고 싶습니다. 도울 수 있니? – user3791488

답변

0

내가 좀처럼 Yii2와 관계형 DB를 사용하지하지만 최선을 가능한 한 내가 무엇을 의미하는지 설명 할 것이다 : 나는 아이가 대략 비슷합니다으로 관계 방향에서 (아파트를 부모 클래스를 설명하는거야

) :이

class ParentModel extends ActiveRecord 
{ 
    /** 
    * @return string the name of the table associated with this ActiveRecord class. 
    */ 
    public static function tableName() 
    { 
     return 'Parents'; 
    } 

    public function getChildren() 
    { 
     // ParentModel has_many ChildModel via Xref.child_id -> id 
     return $this->hasMany(ChildModel::className(), ['id' => 'child_id']) 
      ->viaTable('Xref', ['parent_id' => 'id']); 
    } 
} 

당신은() 예를 들어 사용하여 모든 어린이를 얻을 수 있습니다 :

$user = ParentModel::findOne($userID); 
$children = $user->children; 

그런 다음 확인 Y를 만들기 위해 모든 RBAC의 기능을 사용할 수 있습니다 ou 사용자는 편집 양식 작업 /보기에 액세스 할 수 없습니다. 또는 RBAC rules을 사용하여 적절한 내용 만 처리되는지 확인하십시오. 또는 처리 할 자식이 실제로 컨트롤러 작업에 액세스하는 부모에게 속해 있는지 확인하기 위해 자체 검사를 작성할 수 있습니다. (말하자면 ... 사용자의 자식을 처리중인 노드와 비교하지만 구조에 따라 RBAC 규칙에 의해 처리 될 수 있음)

그러나 동작에 관계없이 해당 논리는 컨트롤러 계층에 남아 있어야합니다. 드문 경우이지만 모델에 액세스 권한 논리를 넣어야하지만 모델은 RBAC 시스템과 관련이 없으며 분리 된 논리를 가져야합니다.저는 개인적으로 ActiveQuery 레벨에있는 그래프 트래버 설 로직과 함께이 문제를 겪었습니다. 하지만 그것은 또 다른 문제입니다.

관련 문제