Zend_ACL: Как спроектировать ACL на основе ролей для нескольких небольших команд? - PullRequest
0 голосов
/ 08 мая 2011

Как должен быть разработан ACL на основе ролей:

Несколько команд, каждая из которых состоит из одного менеджера и нескольких членов и работает из одного места. В каждой локации может быть несколько команд и несколько локаций.

Менеджер каждой команды может только просматривать / редактировать данные для своих членов команды. Человек также может быть членом нескольких команд, независимо от местоположения.

Location_1
-Team_1            -Team_2
 -Manager           -Manager
  -Member_1          -Member_1
  -Member_2          -Member_2

Location_2
-Team_1            -Team_2
 -Manager           -Manager
  -Member_1          -Member_1
  -Member_2          -Member_2

Моя мысль: я думаю разделить ее на две части. Часть 1: должна быть одна группа для каждой команды. Вести таблицу членства группы в базе данных. Часть 2. Теперь каждый пользователь может иметь любую роль. И ACL может быть разработан на основе этих ролей. Но данные будут выбираться на основе части 1. Таким образом, новые команды могут быть добавлены без изменений в коде. Это правильный путь?

1 Ответ

3 голосов
/ 08 мая 2011

Здесь довольно болтливый ответ, только свободное обсуждение, без кода, по крайней мере, на данный момент.

Ваша собственная модель / структура данных должна учитывать членов, местоположения и команды.Я думаю, что вы описали отношения довольно четко, так что это должно быть просто.Мышление реляционно: стол для членов команды, включая менеджеров;стол для локаций;таблица для команд с внешним ключом в местоположениях и внешним ключом в участниках, идентифицирующих менеджера;таблица перекрестных ссылок, связывающая участников с командами.Я предполагаю, что ваша модель участника будет иметь методы для isManagerOfTeam($team), isMemberOfTeam($team), и тому подобное.Довольно просто.

Но многое из этого - просто моделирование отношений, возможно, независимых от контроля доступа.

Для контроля доступа кажется, что местоположение не имеет значения;это команда членство и команда менеджмент , которые являются ключом.

Это также похоже на данные, которые вы пытаетесь контролировать (что в конечном итоге станет ресурсом)') будет помечен идентификатором участника, идентифицирующим «владеющего» члена.Таким образом, модель для этих данных может иметь метод getMember() или даже просто getMemberId().

Итак, я вижу некоторые правила Acl, которые используют экземпляр Zend_Acl_Assert_Interface для проведения динамических проверок отношений между ролями($ member) и эти ресурсы:

  1. My_Acl_Assertion_BelongsToSelf
  2. My_Acl_Assertion_BelongToMemberUnderManagement

Затем методы assert() могут вызывать соответствующие методы модели для методов соответствующей роли, которые передаются в соответствующие методы модели в моделях ролейи ресурсы для проверки отношений между командой и руководством.

Как я уже сказал, это довольно простой ответ, но надеется, что он поможет с некоторыми идеями.

...