3

質問…MySQL権限を追加して、権限に基づいてフィールドの選択のみを許可することは可能ですか?

例:

  1. ユーザーは、列が等しいテーブルuser1からのみ選択/挿入/削除できます(1はPHP経由で渡されます)。usersinstance1
  2. ユーザーは、列が等しいテーブルuser2からのみ選択/挿入/削除できます(1はPHP経由で渡されます)。usersinstance2

背景情報は次のとおりです。

同じコードベースを複数のサイトで使用するアプリケーションを作成しています。アプリ内の条件は、さまざまなレイアウトをロードします。ほとんどの情報はサイト間で共有できるため、複数のサイトが同じデータベースを使用しています。あるサイトに登録するユーザーは、別のサイトにも登録する必要があります(サイトは「招待制」であるため、これが必要です)

私が考えているのは、ユーザーテーブル(ID、電子メール、パスワード、インスタンス)を用意することです。インスタンス列には、サイトのIDが含まれます。

このテーブルから選択/挿入/削除する必要があるたびに、アプリケーション層でインスタンス= [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は条件付きユーザーを許可していません。

両方のサイトに1人のユーザーを使用し、「インスタンス」に応じてすべてのクエリを変更します。したがって、サイト固有の何かをクエリするたびに、を追加しWHERE instance = $site_idます。

于 2012-06-08T17:28:50.600 に答える
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 に答える