2012-06-08 51 views
3

问题......是否可以添加MySQL权限以仅允许根据权限选择字段?MySQL条件用户权限

实施例:

  1. 用户user1只能选择/插入/从users表,其中列instance等于1(1经由PHP被传递)删除。
  2. 用户user2只能从users表中选择/插入/删除,其中列instance等于2(1通过PHP传递)。

这里的背景资料:

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

我在做的是让用户表:id,电子邮件,密码,实例。实例列将具有该网站的ID。每次我需要选择/插入/从这个​​表我附上例如删除= [SITE_ID]到查询...例如时间

在应用层:SELECT * FROM users WHERE email = '' AND instance = [site_id];

+0

由于应用面正在增加实例= x到查询的护理MySQL的只是一个附加的安全如果查询意外没有实例= x。 – iDev247

+1

只是测试你的代码,在代码中没有'意外'这样的事情 –

+0

谢谢你所有的答案和冗长的讨论。我会考虑解决方案并给予适当的奖励。 @pyrate我同意没有意外的代码。有了多个开发人员,从长远来看,很难追踪这类事情。这个问题的另一个原因是向我们处理的公司保证,在站点之间访问用户信息时存在技术安全边界/限制。再次感谢! – iDev247

回答

2

从我所知道的事情来看,MySQL不允许有条件的用户。

为这两个网站使用一个用户,并相应地将您的所有查询修改为您的“实例”。所以每次你查询某个网站特定的内容时,你都会添加WHERE instance = $site_id

3

没有,权限是每个表,分贝,服务器等,但不能用于行,但是有一个解决方案,你可以使用视图表,并设置权限的用户,例如

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

刚刚创建2个视图表,并授予这些用户访问

这里是Mysql documentation

+1

每次您添加新列/更改结构时,2种不同视图都是颈部疼痛,不是吗? –

+0

@pyrate如果你改变了表格结构我认为这对任何应用程序都是一种痛苦,但是如果你的改变不影响你创建视图的方式,那么你完全没有问题 – jcho360

+0

,寻找选择特定的专栏不应受到影响。但是,当你在视图中选择特定的列时(通常你会这样做) - 你需要改变你的两个视图(而不仅仅是如果你有一打网站使用一个代码库),而不仅仅是表格。 –

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,'[email protected]','1'); 
INSERT INTO `user`(`id`,`email`,`instance`) 
    VALUES (NULL,'[email protected]','2'); 
INSERT INTO `user`(`id`,`email`,`instance`) 
    VALUES (NULL,'[email protected]','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 ;