0

首先,对不起我的语言能力,我不习惯用英语写作。;)
我正在尝试开发我的第一个 cakePHP 应用程序。

我正在尝试做的事情:

  • 用户在组中,并且组可以访问不同的位置。
  • 用户可以为此位置添加预订。

所以我的主要问题是找到获得用户权限的最佳方法:

  • 用户应该只看到他有权访问的位置。
  • 如果用户尝试为某个位置添加预订,我必须检查他对该位置的许可。
  • 等等

我也有版主和管理员,但我认为这是一个类似的问题。

那么,我怎样才能正确地做到这一点?ACL 似乎不是正确的方法 - 在大多数教程中,它控制对操作的访问,而不是对 db-rows 的访问。

我的数据库是什么样的:
我有一个用户表并使用 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`)
) 

谢谢

4

2 回答 2

0

你确定你需要这张groups_users桌子吗?不是每个用户只能属于一个组吗?

如果您只是将组 ID 作为外键带入用户表中,您将能够更轻松地完成此操作

    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; ?>
于 2011-03-15T18:56:20.740 回答
0

也许我有一个解决方案 - 我可以使用一些反馈:

用户登录后,我将权限保存在他的 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']);
    }

我不确定这个解决方案有多安全,权限更改只会在注销后影响,但它似乎工作正常。

于 2011-03-16T12:39:53.963 回答