Sebelum Anda menjawab "use current_user()", yang berfungsi pada banyak kasus, atau "use user()", yang sebenarnya tidak berfungsi, harap baca yang berikut...
Saya mencoba membuat tampilan pada tabel yang membatasi akses pengguna ke baris tertentu dalam tabel, dikontrol oleh alamat IP tempat pengguna terhubung.
Upaya pertama saya terlihat seperti ini:
create table testtable (
`RowID` bigint not null auto_increment,
`owner` varchar(64),
`key` varchar(64),
`val` varchar(64),
primary key (`RowID`)
);
create view testview (
`RowID`,
`owner`,
`key`,
`val`
) as select
`testtable`.`RowID` as `RowID`,
`testtable`.`owner` as `owner`,
`testtable`.`key` as `key`,
`testtable`.`val` as `val`
from testtable
where (testtable.owner = substring_index(current_user(), '@', -1));
create user 'testuser'@'192.168.3.30' identified by 'testpass';
grant select, insert, update, delete on testview to 'testuser'@'192.168.3.30';
Sekarang teorinya adalah saya harus bisa masuk sebagai pengguna penguji dari host 192.168.3.30 dan melakukan sesuatu seperti select * from testview
dan mendapatkan subset tabel pengujian yang sesuai untuk saya.
Hal di atas tidak berhasil. Alasannya tidak berhasil adalah karena current_user()
mengembalikan definer tampilan secara default, sehingga tidak ada data, atau (lebih buruk lagi) data yang salah, bergantung pada siapa yang mendefinisikannya. Jika saya ingin current_user()
mengembalikan pengguna yang memanggil, saya perlu membuat tampilan dengan klausa SQL SECURITY INVOKER
, yang juga membatasi hak keamanan hanya untuk pengguna yang memanggil, sehingga menggagalkan tujuan awal kode.
Saya ingin menggunakan user()
, tapi sayangnya, itu hampir selalu mengembalikan nama host/domain, bukan alamat IP.
Catatan tambahan, jika tidak jelas: Mendapatkan alamat IP dalam PHP (atau Ruby, atau Perl, atau apa pun) tidak berguna dalam kasus ini. Saya sedang menyiapkan sedikit keamanan basis data, jadi mengandalkan klien jelas tidak memadai. Saya memerlukan alamat IP di SQL.
Bagi yang penasaran mencari ide/referensi/konteks:
Sebagai referensi, saya mendapatkan ide untuk trik keamanan yang bagus ini dari di sini, namun ternyata tidak. kami menggunakan nama pengguna dan bukan alamat IP, yang akan membuat hal ini lebih mudah. Dalam kasus saya, saya mencoba menyiapkan database host yang sebagian diperbarui dari host itu sendiri. Saya tidak ingin mengatur pengguna yang berbeda untuk setiap host, tapi saya ingin setiap host dapat memperbarui catatannya sendiri (sistem file, kecepatan kipas, suhu, dan sebagainya).
show processlist
akan mencantumkan hal-hal pengguna/ip, tetapi sepertinya tidak ada cara untuk memfilternya berdasarkan pengguna tertentu. Jangan kira ada fungsi/kueri lain yang akan mengembalikan data ini - person Marc B   schedule 09.05.2012