2012-06-08 98 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 ;