Php MySQL条件用户权限

Php MySQL条件用户权限,php,mysql,cakephp,permissions,Php,Mysql,Cakephp,Permissions,问题是……是否可以添加MySQL权限以仅允许基于权限选择字段? 例如: 用户user1只能从users表中选择/插入/删除,其中instance列等于1(1通过PHP传递) 用户user2只能从users表中选择/插入/删除,其中实例列等于2(1通过PHP传递) 以下是背景信息: 我正在创建一个应用程序,该应用程序的代码库用于多个站点。应用程序中的条件加载不同的布局。多个站点使用相同的数据库,因为大多数信息可以在站点之间共享。在一个站点上注册的用户也必须在另一个站点上注册(这是我们想要的方式,因

问题是……是否可以添加MySQL权限以仅允许基于权限选择字段?

例如:

  • 用户
    user1
    只能从
    users
    表中选择/插入/删除,其中
    instance
    列等于
    1
    (1通过PHP传递)
  • 用户
    user2
    只能从
    users
    表中选择/插入/删除,其中
    实例
    列等于
    2
    (1通过PHP传递)
  • 以下是背景信息:

    我正在创建一个应用程序,该应用程序的代码库用于多个站点。应用程序中的条件加载不同的布局。多个站点使用相同的数据库,因为大多数信息可以在站点之间共享。在一个站点上注册的用户也必须在另一个站点上注册(这是我们想要的方式,因为这些站点是“仅受邀请的”)

    我想做的是让users表:id、email、密码、instance。实例列将具有站点的id


    在应用层,每次我需要从这个表中选择/插入/删除时,我都会将instance=[site_id]附加到查询中。。。示例:
    SELECT*来自email=''和instance=[site_id]的用户

    否,权限是针对每个表、数据库、服务器等的,但不针对行,但是有一个解决方案,例如,您可以使用查看表并将权限设置为用户

    mysql> CREATE VIEW test.v AS SELECT * FROM t where email = '' AND instance = [site_id];
    
    只需创建2个视图表并向这些用户授予访问权限


    以下是

    据我所知,这是不可能的,MySQL不允许有条件的用户


    对两个站点使用一个用户,并根据“实例”修改所有查询。因此,每次查询特定于站点的内容时,您都会添加
    WHERE instance=$site\u id

    MySQL不便于根据连接到数据库的MySQL用户使用权限锁定某些行

    如果您希望以这种方式限制用户,最好不要让他们直接访问数据库,而是让他们通过另一层进行连接

    使用视图不是一个好主意-每个用户都必须使用不同的查询(引用他们自己的个人视图)来完成相同的事情。如果您只是限制用户可以看到的列(而不是行),那么视图将是一个很好的解决方案

    可以使用存储过程来完成以下任务:

    # This table already exists in your schema
    CREATE TABLE `user` (
      `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
      `email` VARCHAR(50) NOT NULL,
      `instance` INT(10) UNSIGNED NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=INNODB;
    
    INSERT INTO `user`(`id`,`email`,`instance`) 
        VALUES ( NULL,'wat@lol.com','1');
    INSERT INTO `user`(`id`,`email`,`instance`) 
        VALUES ( NULL,'huh@bwu.com','2');
    INSERT INTO `user`(`id`,`email`,`instance`) 
        VALUES ( NULL,'no@yes.lol','1');
    
    # This would be a new table you would have to create
    CREATE TABLE `user_instance` (
      `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
      `user` VARCHAR(20) NOT NULL,
      `instance` INT(10) UNSIGNED NOT NULL,
      PRIMARY KEY (`id`),
      UNIQUE KEY `user_instance` (`user`,`instance`)
    ) ENGINE=INNODB;
    
    INSERT INTO `user_instance`(`user`,`instance`) VALUES ('user1','1');
    INSERT INTO `user_instance`(`user`,`instance`) VALUES ('user2','2');
    
    # This is a stored procedure that might accomplish what you want
    DELIMITER $$
    CREATE PROCEDURE `p_get_users`()
    BEGIN
        SELECT `user`.`id`, `user`.`email`
        FROM `user`
        WHERE `user`.`instance` IN(
            SELECT `instance` 
            FROM `user_instance` 
            WHERE `user` = USER());
    END$$
    
    DELIMITER ;

    每次添加新列/更改结构时,2个不同的视图都会让人头疼,不是吗?@pyrate如果更改表结构,我认为对任何应用程序来说都是一件痛苦的事情,但是如果更改不影响创建视图的方式,则根本没有问题您完全正确,创建视图而不查看选择特定列不应受到影响。但是,当您在视图中选择特定列时(通常是这样),您需要同时更改两个视图(如果有十几个网站使用一个代码库,则不仅要同时更改这两个视图),而且不仅要更改表。@pyrate同意,因为视图将指向不存在的内容,存储过程、函数、,触发器等。好的观点。不过,我不认为不同的视图是最好的选择:每次添加新站点时,只需使用1个不同的变量创建新视图。这听起来不像是一个最佳的编码实践。由于应用程序端负责将instance=x添加到查询中,MySQL只是一个额外的安全措施,以防查询意外没有instance=x。只需测试您的代码,在编写代码时就不会出现“意外”的情况感谢您的所有答案和冗长的讨论。我将仔细考虑解决方案,并给予适当的奖励@皮拉特我同意没有意外密码。由于有多个开发人员,有时很难长期跟踪这类事情。提出这个问题的另一个原因是,我们向与我们打交道的公司保证,在网站之间访问用户信息存在技术安全边界/限制。再次感谢!