2013-03-11 2 views
-1

Хорошо, я предопределю это, сказав, что я ноб для торта и ACL, и MVC-архитектуры. Я следую учебнику cakephp со своего сайта, http://book.cakephp.org/2.0/en/tutorials-and-examples/simple-acl-controlled-application/part-two.html. Я понимаю содержание учебника, но задаюсь вопросом о самом простом способе взять этот простой групповой ACL на следующий уровень. Я искал SO безрезультатно. Итак, с вопросом.ограничение aro scope в cakephp

Позволяет, например, немного модифицировать версию функции в приведенном выше руководстве. Он просто устанавливает разрешения ARO для ACOs.

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

отношения заключаются в следующем: Район имеет много отделов - один для многих. В округе есть много пользователей, и у пользователей потенциально может быть много районов (пока они принадлежат к отделу в этом районе). Отдел имеет многопользовательских пользователей - многие для многих.

public function initDB() { 
    $group = $this->User->Group; 

    //Allow admins to everything 
    $group->id = 1; 
    $this->Acl->allow($group, 'controllers'); 

    // issue 1) allow district managers to districts, departments, users 
    $group->id = 2; 
    $this->Acl->deny($group, 'controllers'); 
    $this->Acl->allow($group, 'controllers/Districts'); 
    $this->Acl->allow($group, 'controllers/Departments'); 
    $this->Acl->allow($group, 'controllers/Users'); 

    //issue 2) allow department managers to edit departments and users 
    $group->id = 3; 
    $this->Acl->deny($group, 'controllers'); 
    $this->Acl->allow($group, 'controllers/Departments'); 
    $this->Acl->allow($group, 'controllers/Users'); 
    //we add an exit to avoid an ugly "missing views" error message 
    echo "all done"; 
    exit; 

}

Итак, эти права являются установки, хотя это, безусловно, удобно, на самом деле решить небольшую часть проблемы. Как бы то ни было, я действительно только помешал администраторам отдела выполнять функции районного уровня. Администраторы домена и администраторы домена могут выполнять пользователя CRUD без ограничений.

То, что я хотел бы сделать, ограничивает сферу применения каждого из типов администраторов USER CRUD только теми пользователями, которые находятся в пределах их отдела или района. например, администратор отдела администрирования Foo не может удалить других пользователей Admin, а панель управления правами администратора не может изменить все имена других пользователей Dist Admin с именами nancy.

lol. Я серьезно не понимаю, как это сделать.

Я предполагаю, что один из подходов будет получать ранжирование администраторов, например dist admin, а затем выяснить, в каком районе он является пользователем. наконец, вернуть всех пользователей этого района в переменную $ userScope. Опять же, я новичок в pake php и не знаю, как выполнить это предложение, даже если это была хорошая идея и лучший способ справиться с этим. Какие-либо предложения?? Заранее спасибо!!!

Редактировать: Полезный ответ, @nicolae.

Однако все же кажется, что я могу написать функцию, которая возвращает всех пользователей, которым разрешено редактировать любой заданный администратор (любого данного aco). кажется таким образом для меня, потому что я предполагаю, что администратор сам будет частью возвращенной базы пользователей. например, dist admin dist 9, находится в dist 9; аналогично, администратор отдела 1, находится в отделе 1.

ouch. предоставил все таблицы соединений, участвующие в объединении этой информации, это обязательно будет выглядеть как волосы медузы, когда на самом деле набирается. вы можете увидеть мою линию логики. для меня это немного сложно сформулировать. дайте мне знать, если я должен прояснить что-нибудь еще.

ответ

1

Так вы пытаетесь установить систему ACL, которая управляет ограничения, основанные на более группы ID и контроллер/действие - вам нужно София- и район на основе ограничений.
Насколько я знаю, встроенная система ACL в CakePHP может не управлять этим уровнем ограничений.

В качестве решения, я рекомендую вам разрешить пользователь в места, они должны получить доступ (например, админ DEPT имеет ACL доступ к интерфейсу пользователя CRUD) и вставить определенные ограничения в контроллере.

function editUserFromDepartment($userId = NULL) { 
    // Custom ACL check 
    if (! $this->__checkDepartmentByUserId($userId)) { 
     // Show the user a custom error message and redirect him to index page 
    } 

    // User editing code ... 
} 

function __checkDepartmentByUserId($userId) { 
    $dept = $this->Department->getByUserId($userId); 

    // Check if the current user belongs to this department 
    $currentUserDepartmentId = $this->Session->read('Auth.User.department_id'); 

    return ($dept['Department']['id'] != $currentUserDepartmentId); 
} 

Удачи и дайте мне знать, если мое объяснение было достаточно ясно.

Николай

Редактировать (пытаясь ответить на @ редактировать Тодд): я получить свою точку зрения. Ваш код нацелен на получение всех пользователей, к которым имеет доступ текущий пользователь. Вместо этого у меня был бы подход, основанный на событиях: когда пользователь X пытается отредактировать, выполнить запрос, который находит, если Auth.User разрешено выполнять это действие на пользователе X.

E.g. Вы (Тодд) пытаетесь изменить мой профиль (NicolaeS), чтобы изменить свой идентификатор сотрудника, поскольку мой текущий неверен.
Функция $this->getUserScope('user-ID-of-NicolaeS') проверяет, соответствует ли ваш идентификатор отдела или идентификационным номерам округа, и разрешить/запретить вам продолжать действия в соответствии с этой проверкой.

Это ясно или ясно?

здоровается, Nicolae

+0

@Todd поэтому я ответил вам в дальнейшем с правкой мой ответ. Пожалуйста, проверьте его выше. – NicolaeS

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