如何在cakePHP中获取权限

如何在cakePHP中获取权限,cakephp,permissions,authorization,cakephp-1.3,row-level-security,Cakephp,Permissions,Authorization,Cakephp 1.3,Row Level Security,首先,对不起我的语言能力,我不习惯用英语写作 我正在尝试开发我的第一个cakePHP应用程序 我想做的是: 用户在组中,组具有 进入不同地点 用户可以为此添加预订 地点 因此,我的主要问题是找到获得用户权限的最佳方法: 用户应该只看到他可以访问的位置 如果用户试图为某个位置添加预订,我必须检查他对此位置的权限 等等 我也有版主和管理员,但我认为这是一个类似的问题 那么,我怎样才能正确地做到这一点呢?ACL似乎不是正确的方式——在大多数教程中,它控制对操作的访问,而不是对db行的访问 我的

首先,对不起我的语言能力,我不习惯用英语写作
我正在尝试开发我的第一个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

您确定需要
用户组
表吗?难道每个用户不能只属于一个组吗

如果将组id作为外键带入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\u 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; ?>

//显示可供管理员使用的记录
//显示登录用户可用的记录
//显示所有用户的记录

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

用户登录后,我将权限保存在他的会话变量中:

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

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

是的,很遗憾,我需要
组用户
表。它仍然有点不清楚。你想限制什么?视图文件的某些部分?或者你会根据登录的用户->组使用单独的视图文件吗?我正试图根据它们的参数限制对操作的访问。例如:A组可以访问位置1和3,但不能访问位置2。如果组a中的用户尝试访问domain.tld/location/view/1,则该用户可以访问该域。如果他试图访问domain.tld/location/view/2,则应拒绝访问。域的相同过程。tld/保留/添加/位置:2。因此,我的主要问题是(或曾经是)如何从不同的控制器访问用户权限,而不加载不必要的db-tables。因此,在app_控制器中设置变量并将其发送到视图应该可以。。。