Как получить разрешения в cakePHP - PullRequest
0 голосов
/ 15 марта 2011

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

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

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

Поэтому моя главная проблема - найти лучший способ получить разрешения пользователя:

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

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

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

Как выглядит моя база данных:
У меня есть таблица пользователей и я использую 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`)
) 

THX

Ответы [ 2 ]

0 голосов
/ 16 марта 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']);
    }

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

0 голосов
/ 15 марта 2011

Вы уверены, что вам нужен стол 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; ?>
...