Saya memiliki tabel terstruktur seperti itu (Sederhana)
Name, EMail, LastLoggedInAt
Saya memiliki pengguna di SQL Server (RemoteUser) yang seharusnya hanya dapat melihat data (Melalui kueri pemilihan) di mana bidang LastLoggdInAt bukan nol.
Sepertinya saya bisa melakukan ini? Apa itu mungkin?
Jawaban:
Model keamanan SQL Server memungkinkan Anda untuk memberikan akses ke tampilan tanpa memberikan akses ke tabel yang mendasarinya.
Karena kode contoh adalah cara yang bagus untuk menunjukkan konsep, pertimbangkan yang berikut, dengan
LoginDetails
tabel, dan tampilan yang sesuai:Kami akan membuat login, dan pengguna, lalu memberikan hak kepada pengguna itu untuk memilih baris dari tampilan, tanpa memiliki hak untuk melihat tabel itu sendiri.
Sekarang, kami akan memasukkan dua baris uji:
Ini menguji model keamanan.
SELECT
Pernyataan pertama berhasil, karena memilih dari tampilan, sedangkanSELECT
pernyataan kedua gagal karena pengguna tidak memiliki akses langsung ke tabel.Catat hasil dari tampilan mengecualikan baris tempat
LastLoggedInAt
nilainyaNULL
, seperti yang dipersyaratkan dalam pertanyaan Anda.SELECT
Pernyataan kedua terhadap tabel yang mendasari menghasilkan kesalahan:Membersihkan:
Sebagai alternatif, jika Anda memiliki SQL Server 2016 atau yang lebih baru, Anda bisa menggunakan predikat tingkat-keamanan untuk mencegah pengguna tertentu melihat baris dengan
LastLoggedInAt
nilai NULL .Pertama, kami membuat tabel, login, pengguna untuk login itu, dan kami memberikan akses ke tabel:
Selanjutnya, kami menyisipkan beberapa baris sampel. Satu baris dengan nol
LastLoggedInAt
, dan satu dengan nilai bukan nol untuk kolom itu.Di sini, kami membuat fungsi tabel-nilai-terikat-skema-terikat yang mengembalikan baris dengan 0 atau 1 tergantung pada nilai
@LastLoggedInAt
dan@username
variabel yang diteruskan ke fungsi. Fungsi ini akan digunakan oleh predikat-filter untuk menghilangkan baris yang ingin kita sembunyikan dari pengguna tertentu.Ini adalah filter keamanan yang menghilangkan baris dari
SELECT
pernyataan yang dijalankan terhadapdbo.LoginDetails
tabel:Filter di atas menggunakan
dbo.fn_LoginDetailsRemoteUserPredicate
fungsi dengan mengirimkan nama pengguna saat ini, bersama dengan nilai dari setiap baris untukLastLoggedInAt
kolom daridbo.LoginDetails
tabel.Jika kami meminta tabel sebagai pengguna normal:
kita melihat semua baris:
Namun, jika kami uji sebagai
RemoteUser
:kami hanya melihat baris "valid":
Dan, kami membersihkan:
Perlu diketahui bahwa pengikatan skema fungsi ke tabel dengan cara ini tidak membuat tidak mungkin untuk mengubah definisi tabel tanpa terlebih dahulu menjatuhkan predikat filter, dan
dbo.fn_LoginDetailsRemoteUserPredicate
fungsi.sumber
LastLoggedInAt
kolom.