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| 
... 

Пример таблицы Xref (Отношение к детей и Родители):

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

Я думаю, что класс ActiveRecord Дети бы быть правильным местом для поведения, как это, не так ли? Есть ли у кого-нибудь пример кода, который указывает мне правильное направление для эффективного кода, , где Павел и Анна могли бы изменить запись для «Макс», но не для «Морица»?

+0

Общепринято считать, что плохой дизайн используется RBAC на уровне записи. В вашем случае вы, вероятно, должны иметь метод «ActiveRecord», который принимает идентификатор пользователя «id» в качестве параметра и возвращает дочерние элементы. Фильтр уровня RBAC (независимо от того, можете ли вы писать/просматривать) должен находиться на уровне контроллера. –

+0

Согласен, спасибо за подсказку. Будучи новичком в yii (не новичком в программировании), я хотел бы попросить фрагмент кода в качестве примера, чтобы встать на ноги. Вы можете помочь? – user3791488

ответ

0

я вряд ли когда-либо использовать реляционные БД с Yii2, но я проиллюстрирую, что я имел в виду как можно лучше:

Я собираюсь показать родительский класс, как ребенок будет примерно одинаковым (Appart от направления отношений):

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; 

вы можете использовать все функциональные возможности RBAC, чтобы убедиться, что у ou пользователи не могут получить доступ к действию/представлению формы редактирования. Или используйте RBAC rules, чтобы убедиться, что обрабатывается только соответствующий контент. Или вы могли бы написать свои собственные чеки, чтобы удостовериться (например) в том, что обработанные дети действительно принадлежат Родительскому доступу к действию контроллера. (скажем ... сравнение детей пользователя с обработанными, хотя в зависимости от вашей структуры это может быть обработано правилами RBAC)

Но независимо от действий эта логика должна оставаться на уровне контроллера. В некоторых очень редких случаях вам может потребоваться установить логику доступа в ваших моделях, но модели должны иметь эту логику, разделенную и не связанную с системой RBAC.Я лично имел эту проблему с логикой обхода графика, которая находится на уровне ActiveQuery. Но это еще одна проблема в ее собственном праве.

Смежные вопросы