it-swarm.asia

Berikan hak istimewa tabel kepada pengguna yang terhubung dari host mana pun

Saya memiliki akun pengguna - sebut saja 'wordpress' - yang perlu saya izinkan untuk mengakses beberapa tabel katalog di basis data e-commerce lain di server yang sama. Saya telah mengonfigurasi pengguna dengan tiga topeng Host yang diizinkan untuk terhubung dari: 'localhost', alamat IP server web, dan nama host server web. Tidak ada masalah di sana.

Pengguna 'wordpress' juga memiliki akses penuh ke basis datanya sendiri, yang diberikan melalui bagian Schema Privileges di MySQL Workbench. Di sini, ia menunjukkan Host adalah '%', yang saya inginkan, karena saya tidak ingin mengelola tiga set privilese duplikat untuk pengguna yang sama. Jika saya melihat di mysql.db, saya melihat hak istimewa ini, dengan '%' di kolom Host.

Jadi sekarang saya ingin memberikan izin SELECT pada beberapa tabel di database lain - sebut saja 'toko'. Jadi saya coba ini:

GRANT SELECT ON store.catalog TO 'wordpress'@'%';

Dan saya mendapatkan 'Tidak dapat menemukan baris yang cocok di tabel pengguna', karena alasan yang jelas bahwa '%' bukan topeng Host saya sudah secara eksplisit mengizinkan koneksi dari untuk pengguna tertentu ini. Jadi apa sintaksis yang tepat untuk memberikan hak istimewa tabel kepada pengguna dari topeng Host yang diizinkan? Bagaimana MySQL Workbench lolos begitu saja untuk hak istimewa skema? Saya tidak harus memasukkan baris secara manual ke mysql.tables_priv, bukan?

PEMBARUAN : Untuk memperjelas, inilah tampilan tabel pengguna/hibah saat ini. Saya sudah anonim beberapa nama, jelas. Perhatikan bahwa Host di tabel privilege skema adalah '%', tetapi tidak ada pengguna dengan Host itu. Bagaimana saya mendapatkan MySQL untuk membiarkan saya melakukannya dengan hibah objek skema? Lebih disukai tanpa mucking langsung di mysql.tables_priv, tapi saya akan melakukannya jika sampai ke sana.

mysql> SELECT user, Host FROM mysql.user WHERE user = 'wordpress';
+-----------+-----------+
| user      | Host      |
+-----------+-----------+
| wordpress | 10.0.0.22 |
| wordpress | webserver |
| wordpress | localhost |
+-----------+-----------+
3 rows in set (0.00 sec)

mysql> SELECT user, Host, db, select_priv FROM mysql.db WHERE User = 'wordpress';
+-----------+------+----------------+-------------+
| user      | Host | db             | select_priv |
+-----------+------+----------------+-------------+
| wordpress | %    | wordpress      | Y           |
| wordpress | %    | wordpress_test | Y           |
+-----------+------+----------------+-------------+
2 rows in set (0.00 sec)

mysql> SHOW GRANTS FOR 'wordpress'@'localhost';
+---------------------------------------------------------------------------+
| Grants for [email protected]                                            |
+---------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'wordpress'@'localhost' IDENTIFIED BY PASSWORD '--' |
+---------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> SHOW GRANTS FOR 'wordpress'@'%';
ERROR 1141 (42000): There is no such grant defined for user 'wordpress' on Host '%'

Apakah MySQL Workbench melakukan sesuatu yang sangat tidak berdokumen dengan skema/hak istimewa objek? Hanya untuk iseng, saya memberikan beberapa hak istimewa tabel ke salah satu kombinasi pengguna @ Host tertentu, lalu memperbarui mysql.tables_priv untuk mengubah Host menjadi '%'. Setelah menjalankan PRIVILEGUS FLUSH, itu bekerja dengan sempurna. Aneh.

6
db2

Ketika Anda menjalankan GRANT SELECT ON store.catalog TO 'wordpress'@'%';, mysqld ingin menyisipkan baris ke dalam tabel hibah mysql.tables_priv. Inilah mysql.tables_priv:

mysql> show create table mysql.tables_priv\G
*************************** 1. row ***************************
       Table: tables_priv
Create Table: CREATE TABLE `tables_priv` (
  `Host` char(60) COLLATE utf8_bin NOT NULL DEFAULT '',
  `Db` char(64) COLLATE utf8_bin NOT NULL DEFAULT '',
  `User` char(16) COLLATE utf8_bin NOT NULL DEFAULT '',
  `Table_name` char(64) COLLATE utf8_bin NOT NULL DEFAULT '',
  `Grantor` char(77) COLLATE utf8_bin NOT NULL DEFAULT '',
  `Timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `Table_priv` set('Select','Insert','Update','Delete','Create','Drop','Grant','References','Index','Alter','Create View','Show view','Trigger') CHARACTER SET utf8 NOT NULL DEFAULT '',
  `Column_priv` set('Select','Insert','Update','References') CHARACTER SET utf8 NOT NULL DEFAULT '',
  PRIMARY KEY (`Host`,`Db`,`User`,`Table_name`),
  KEY `Grantor` (`Grantor`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Table privileges'
1 row in set (0.00 sec)

mysql>

Karena Anda ingin memasukkan baris ke mysql.table_priv di mana pengguna = 'wordpress' dan Host = '%', harus ada baris di mysql.user di mana pengguna = 'wordpress' dan Host = '%'.

Anda juga menyebutkan bahwa Anda menggunakan MySQL Workbench. Anda harus menggunakan 'root'@'localhost'. Itu biasanya memiliki semua hak dan kata sandi.

Jika Anda hanya ingin mengizinkan anonim SELECT terhadap tabel itu, pertama jalankan ini:

GRANT USAGE ON *.* TO 'wordpress'@'%';

Ini akan menempatkan [email protected]'%' ke mysql.user. Setelah itu, GRANT SELECT ON store.catalog TO 'wordpress'@'%' harus berjalan dengan baik.

Anda harus melihat entri lain wordpress dalam mysql.user. Ini harus menunjukkan apa perintah SQL GRANT yang Anda butuhkan:

SELECT CONCAT('GRANT SELECT ON store.catalog TO ',userhost,';') GrantCommand
FROM
(
    SELECT CONCAT('''',user,'''@''',Host,'''') userhost
    FROM mysql.user WHERE user='wordpress'
) A;
3
RolandoMySQLDBA

Ini berhasil bagi saya menggunakan baris perintah (bukan workbench):

mysql> GRANT SELECT ON foo.bar TO 'wordpress'@'%';
Query OK, 0 rows affected (0.07 sec)

mysql> SHOW GRANTS FOR [email protected]'%';
+------------------------------------------------+
| Grants for [email protected]%                         |
+------------------------------------------------+
| GRANT USAGE ON *.* TO 'wordpress'@'%'          |
| GRANT SELECT ON `foo`.`bar` TO 'wordpress'@'%' |
+------------------------------------------------+
2 rows in set (0.05 sec)

Saya mencari-cari dan menemukan ini laporan bug . Apa versi Workbench Anda? Tampaknya mereka sudah memperbaiki, tetapi tidak menjadi pengguna Workbench, saya tidak tahu versi mereka (versi saat ini harus diperbaiki).

Bahkan jika tidak, solusinya adalah menjalankannya melalui command line!

2
Derek Downey