Как получить разрешения в cakePHP

Во-первых, извините за мои языковые навыки, я не привык писать по-английски. ;)
Я пытаюсь разработать свое первое приложение cakePHP.

Что я пытаюсь сделать:

  • Пользователи находятся в группах, а группы имеют доступ к разным местам.
  • Пользователи могут добавлять резервирования для этих мест.

Итак, моя основная проблема - найти лучший способ получить разрешения пользователя:

  • Пользователь должен видеть только те локации, к которым у него есть доступ.
  • Если пользователь пытается добавить бронирование для местоположения, я должен проверить его разрешение для этого местоположения.
  • и Т. Д.

У меня тоже есть модераторы и админы, но я думаю, что это аналогичная проблема.

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

Как выглядит моя база данных:
У меня есть таблица пользователей, и я использую AuthComponent для управления аутентификацией. Это прекрасно работает.

CREATE TABLE IF NOT EXISTS `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `email` varchar(64) NOT NULL,
  `password` varchar(64) NOT NULL,
  `enabled` tinyint(1) NOT NULL,
  `created` datetime NOT NULL,
  `modified` datetime NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `email` (`email`)
) 

У меня есть таблица групп для групп пользователей.

CREATE TABLE IF NOT EXISTS `groups` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(64) NOT NULL,
  `created` datetime NOT NULL,
  `modified` datetime NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `name` (`name`)
)


CREATE TABLE IF NOT EXISTS `groups_users` (
  `group_id` int(11) NOT NULL,
  `user_id` int(11) NOT NULL,
  UNIQUE KEY `group_id` (`group_id`,`user_id`)
) 

И у меня есть свои локации.

CREATE TABLE IF NOT EXISTS `locations` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(64) NOT NULL,
  `adress` text NOT NULL,
  `description` text,
  `created` datetime DEFAULT NULL,
  `modified` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `name` (`name`)
) 

Таблица содержит разрешения, какая группа имеет доступ к какому местоположению.

CREATE TABLE IF NOT EXISTS `groups_locations` (
  `group_id` int(11) NOT NULL,
  `location_id` int(11) NOT NULL,
  UNIQUE KEY `group_id` (`group_id`,`location_id`)
)

Конечно таблица бронирования:

CREATE TABLE IF NOT EXISTS `reservations` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `location_id` int(11) NOT NULL,
  `start` date NOT NULL,
  `end` date NOT NULL,
  `user_id` int(11) NOT NULL,
  `created` datetime DEFAULT NULL,
  `modified` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) 

Спасибо


person Telokar    schedule 15.03.2011    source источник


Ответы (2)


Вы уверены, что вам нужна таблица groups_users? Разве каждый пользователь не сможет принадлежать только к одной группе?

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

    CREATE TABLE IF NOT EXISTS `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `email` varchar(64) NOT NULL,
  `password` varchar(64) NOT NULL,
  `enabled` tinyint(1) NOT NULL,
  `created` datetime NOT NULL,
  `modified` datetime NOT NULL,
  `group_id` int(11) NOT NULLL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `email` (`email`)
)

Затем вы можете отправить в представление, должен ли пользователь видеть определенную информацию...

в вашем app_controller.php добавьте следующее

function beforeFilter(){
    $this->set('users_role', $this->Auth->user('group_id'));
}

Теперь у вас будет переменная, доступная вашему представлению, которая будет $users_role... тогда вы можете выполнить следующее в своем представлении.

<?php if($users_role == 1 ): ?>
    //show records available to admins
<?php elseif ($users_role == 2): ?>
    //show records available to logged in users
<?php else : ?>
    //show records for all users
<?php endif; ?>
person Tim Joyce    schedule 15.03.2011
comment
Да, к сожалению, мне нужна таблица groups_users. - person Telokar; 16.03.2011

Может быть, у меня есть решение - я мог бы использовать некоторые отзывы:

После того, как пользователь вошел в систему, я сохраняю разрешения в его Session-Variables:

    function login() {
        if($user = $this->Auth->user()) {       
            $this->User->unbindModel(array(
                    'hasMany' => array('Reservation'),
            ));
            $user = $this->User->find('first', array('conditions' => array('id' => $user['User']['id']), 'recursive' => 2));
            $this->Session->write('Auth.User.Group', $user['Group']);
    }

Я не уверен, насколько безопасно это решение, и изменения разрешений действуют только после выхода из системы, но, похоже, оно работает нормально.

person Telokar    schedule 16.03.2011
comment
Это все еще немного неясно. Что вы пытаетесь ограничить? определенные части файла представления? или у вас будут отдельные файлы просмотра, основанные на группе пользователей, которые входят в систему? - person Tim Joyce; 16.03.2011
comment
Я пытаюсь ограничить доступ к действиям в зависимости от их параметров. Например: Группа А имеет доступ к местоположению 1 и 3, но не имеет доступа к местоположению 2. Если пользователь в группе А попытается получить доступ к domain.tld/location/view/1, он получит к нему доступ. Если он попытается получить доступ к domain.tld/location/view/2, доступ должен быть запрещен. Та же процедура для domain.tld/reservation/add/location:2. Итак, моя основная проблема заключается (или была) в том, как получить доступ к разрешению пользователя с разных контроллеров, не загружая ненужные таблицы БД. - person Telokar; 16.03.2011
comment
Таким образом, установка переменной в вашем app_controller и отправка ее в представление должны работать тогда... - person Tim Joyce; 16.03.2011