3

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

例子:

  1. 用户user1只能从usersinstance等于的表中选择/插入/删除1(1 通过 PHP 传递)。
  2. 用户user2只能从usersinstance等于的表中选择/插入/删除2(1 通过 PHP 传递)。

这是背景信息:

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

我想做的是让用户表:id,电子邮件,密码,实例。实例列将具有站点的 ID。

在应用程序层上,每次我需要从该表中选择/插入/删除时,我都会将 instance = [site_id] 附加到查询中......例如:SELECT * FROM users WHERE email = '' AND instance = [site_id];

4

3 回答 3

3

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

mysql> CREATE VIEW test.v AS SELECT * FROM t where email = '' AND instance = [site_id];

只需创建 2 个视图表并授予这些用户访问权限

这是Mysql文档

于 2012-06-08T17:28:31.240 回答
2

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 ;
于 2012-06-08T19:20:15.443 回答
2

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

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

于 2012-06-08T17:28:50.600 回答