【问题标题】:How to get permissions in cakePHP如何在 cakePHP 中获取权限
【发布时间】:2011-07-15 19:54:53
【问题描述】:

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

谢谢

【问题讨论】:

    标签: cakephp permissions authorization cakephp-1.3 row-level-security


    【解决方案1】:

    您确定需要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; ?>
    

    【讨论】:

    • 是的,很遗憾我需要groups_users 表。
    【解决方案2】:

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

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

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

    【讨论】:

    • 还是有点不清楚。你想限制什么?视图文件的某些部分?或者你会根据登录的用户->组有单独的视图文件吗?
    • 我正在尝试根据操作的参数来限制对操作的访问。例如:A 组可以访问位置 1 和 3,但不能访问位置 2。如果 A 组中的用户尝试访问 domain.tld/location/view/1,他可以访问它。如果他试图访问 domain.tld/location/view/2 访问应该被拒绝。 domain.tld/reservation/add/location:2 的过程相同。所以我的主要问题是(或曾经是)如何在不加载不必要的数据库表的情况下从不同的控制器访问用户权限。
    • 因此在您的 app_controller 中设置变量并将其发送到视图应该可以工作......
    猜你喜欢
    • 2011-04-29
    • 1970-01-01
    • 1970-01-01
    • 2022-09-23
    • 1970-01-01
    • 2016-09-09
    • 2019-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多