0

首先,對於我的語言技能感到抱歉,我不習慣用英文寫作。 ;)
我想開發我的第一個cakePHP應用程序。如何獲得蛋糕的權限PHP

我想要做的事:

  • 用戶在團體和團體 訪問不同的位置。
  • 用戶可以爲此 位置添加預訂。

所以我的主要問題是要找到獲取用戶的權限的最佳方法:

  • 用戶應該只看到他具有訪問權限的位置。
  • 如果用戶試圖爲位置添加預訂,我必須檢查他對此位置的許可。

我也有版主和管理員,但我認爲這是一個類似的問題。

那麼,我該如何正確地做到這一點? ACL似乎並不是正確的方式 - 在大多數教程中,它控制對行爲的訪問,而不是對db行。

什麼我的數據庫看起來像:
我有一個用戶表,並使用AuthComponent管理認證。這工作正常。我有一個用戶組組表格。

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

回答

0

也許我有一個解決方案 - 我可以使用一些反饋:

用戶登錄後,我保存的權限在他的會話變量:

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

這還有點不清楚。你想限制什麼?視圖文件的某些部分?或者您是否具有基於登錄的用戶 - >組的獨立視圖文件? – 2011-03-16 14:48:35

+0

我試圖根據參數限制對操作的訪問。例如:組A可以訪問位置1和3,但不能訪問位置2.如果組A中的用戶嘗試訪問domain.tld/location/view/1,則可以訪問它。如果他試圖訪問domain.tld/location/view/2,則應該拒絕訪問。 domain.tld/reservation/add/location的過程相同:2。 所以我的主要問題是(或是)如何從不同的控制器訪問用戶權限,而不加載不必要的數據庫表。 – Telokar 2011-03-16 15:13:46

+0

因此,在您的app_controller中設置變量並將其發送到視圖應該可以工作...... – 2011-03-16 16:35:48

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')); 
} 

現在你將有你的看法變accessable這將是$ 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; ?> 
+0

是的,不幸的是我需要'groups_users'表。 – Telokar 2011-03-16 12:33:00