Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Penyusun API Data mendukung kebijakan database yang memfilter hasil kueri berdasarkan ekspresi yang Anda tentukan. Database mengevaluasi kebijakan ini sebagai predikat kueri (WHERE klausa), sehingga pengguna hanya melihat data yang diizinkan untuk mereka akses.
Kapan menggunakan kebijakan database
Kebijakan database sangat ideal ketika Anda perlu:
- Membatasi rekaman berdasarkan nilai bidang (misalnya,
status eq 'published') - Memfilter data berdasarkan klaim pengguna yang diautentikasi (misalnya,
@claims.userId) - Menerapkan kontrol akses tingkat baris tanpa memodifikasi prosedur atau tampilan tersimpan
- Menerapkan aturan pemfilteran yang berbeda per peran
Nota
Azure Cosmos DB for NoSQL saat ini tidak mendukung kebijakan database.
Tindakan yang didukung
Kebijakan database berlaku untuk tindakan ini:
| Action | Dukungan | Cara kerjanya |
|---|---|---|
read |
✔️ Ya | Menambahkan predikat WHERE ke kueri SELECT |
update |
✔️ Ya | Menambahkan predikat WHERE ke pernyataan UPDATE |
delete |
✔️ Ya | Menambahkan predikat WHERE ke pernyataan DELETE |
create |
❌ Tidak | Pernyataan INSERT tidak mendukung predikat WHERE |
execute |
❌ Tidak | Prosedur tersimpan tidak mendukung predikat kueri |
Prasyarat
- CLI penyusun API Data terinstal (panduan penginstalan)
- File konfigurasi yang ada dengan setidaknya satu entitas
- Penyedia autentikasi dikonfigurasi (kebijakan memerlukan permintaan terautentikasi)
Referensi cepat
| Konsep | Sintaksis | Example |
|---|---|---|
| Referensi bidang | @item.<field> |
@item.status |
| Referensi klaim | @claims.<type> |
@claims.userId |
| Kesetaraan | eq |
@item.ownerId eq @claims.userId |
| Ketidaksetaraan | ne |
@item.status ne 'draft' |
| Perbandingan |
gt,ge,lt,le |
@item.price lt 100 |
| DAN Logika | and |
@item.active eq true and @item.published eq true |
| ATAU Logika | or |
@item.role eq 'admin' or @item.role eq 'editor' |
Langkah 1: Tentukan ekspresi kebijakan
Kebijakan database menggunakan predikat bergaya OData. Ekspresi harus menghasilkan nilai benar agar baris disertakan dalam hasil.
Rujukan bidang dengan @item
Gunakan @item.<field> untuk mereferensikan bidang entitas. Jika Anda memetakan kolom database ke nama bidang API yang berbeda, gunakan nama yang dipetakan.
@item.status eq 'published'
Referensi klaim dengan @claims
Gunakan @claims.<claimType> untuk menyuntikkan nilai dari token pengguna yang diautentikasi. Pada runtime, penyusun Data API menggantikan nilai klaim ke dalam ekspresi.
@item.ownerId eq @claims.userId
Penting
Jika klaim yang direferensikan hilang dari token, permintaan ditolak dengan respons Terlarang 403.
Ekspresi gabungan
Gabungkan kondisi menggunakan and atau or:
@item.ownerId eq @claims.userId and @item.status ne 'deleted'
Langkah 2: Tambahkan kebijakan ke konfigurasi entitas
Kebijakan ditentukan untuk setiap tindakan dalam izin suatu peran:
Format file konfigurasi
{
"entities": {
"<entity-name>": {
"permissions": [
{
"role": "<role-name>",
"actions": [
{
"action": "read",
"policy": {
"database": "<predicate-expression>"
}
}
]
}
]
}
}
}
Contoh: Pengguna hanya dapat membaca rekaman mereka sendiri
{
"entities": {
"Order": {
"source": "dbo.Orders",
"permissions": [
{
"role": "customer",
"actions": [
{
"action": "read",
"policy": {
"database": "@item.customerId eq @claims.userId"
}
}
]
}
]
}
}
}
Contoh: Beberapa tindakan dengan kebijakan yang sama
Terapkan kebijakan yang sama untuk membaca, memperbarui, dan menghapus:
{
"entities": {
"Document": {
"source": "dbo.Documents",
"permissions": [
{
"role": "author",
"actions": [
{
"action": "read",
"policy": {
"database": "@item.authorId eq @claims.sub"
}
},
{
"action": "update",
"policy": {
"database": "@item.authorId eq @claims.sub"
}
},
{
"action": "delete",
"policy": {
"database": "@item.authorId eq @claims.sub"
}
}
]
}
]
}
}
}
Contoh: Filter nilai statis
Filter menggunakan nilai tetap alih-alih klaim
{
"entities": {
"Article": {
"source": "dbo.Articles",
"permissions": [
{
"role": "Anonymous",
"actions": [
{
"action": "read",
"policy": {
"database": "@item.status eq 'published'"
}
}
]
}
]
}
}
}
Langkah 3: Mengonfigurasi menggunakan CLI
dab update Gunakan perintah untuk menambahkan kebijakan melalui CLI:
dab update Order \
--permissions "customer:read" \
--policy-database "@item.customerId eq @claims.userId"
Petunjuk / Saran
Saat ekspresi kebijakan berisi karakter khusus, sertakan dalam tanda kutip yang sesuai untuk shell Anda.
Bagaimana kebijakan diproses
Saat permintaan tiba, penyusun API Data:
-
Mengidentifikasi peran efektif dari header atau peran sistem
X-MS-API-ROLE - Penelusuran kebijakan untuk kombinasi entitas, peran, dan tindakan
-
Mengganti klaim dengan mengganti
@claims.<type>token dengan nilai aktual dari token - Mengurai ekspresi sebagai filter $ OData
- Menghasilkan predikat kueri yang ditambahkan ke kueri database
Misalnya, jika kebijakan adalah @item.ownerId eq @claims.userId dan token berisi userId: "user123", SQL yang dihasilkan meliputi:
WHERE [ownerId] = 'user123'
Penggantian klaim
Penyusun API Data mengekstrak klaim dari JSON Web Token (JWT) pengguna yang diautentikasi atau prinsip identitas. Klaim umum meliputi:
| Tuntutan | Deskripsi | Contoh nilai |
|---|---|---|
sub |
Pengidentifikasi subjek (ID pengguna) | 00aa00aa-bb11-cc22-dd33-44ee44ee44ee |
userId |
Pengidentifikasi pengguna kustom | user123 |
email |
Alamat email pengguna | user@example.com |
name |
Nama tampilan pengguna | Jane Doe |
roles |
Keanggotaan peranan (array) | ["reader", "editor"] |
Peringatan
Jika klaim yang dirujuk dalam kebijakan tidak ada dalam token, pembuat API Data menolak permintaan dengan respons Terlarang 403. Pastikan penyedia identitas (IdP) Anda menyertakan semua klaim yang diperlukan.
Gabungkan dengan pembatasan lapangan
Kebijakan berfungsi bersama kontrol akses tingkat lapangan. Anda dapat membatasi baris mana dan kolom mana yang dapat diakses peran:
{
"role": "auditor",
"actions": [
{
"action": "read",
"fields": {
"include": ["id", "amount", "status"],
"exclude": ["internalNotes"]
},
"policy": {
"database": "@item.status eq 'completed'"
}
}
]
}
Keterbatasan
| Pembatasan | Rincian |
|---|---|
Tidak ada create tindakan |
Pernyataan INSERT tidak mendukung predikat WHERE |
Tidak ada execute tindakan |
Prosedur tersimpan tidak menerima predikat kueri |
| Tidak ada Azure Cosmos DB untuk NoSQL | Api NoSQL saat ini tidak mendukung kebijakan database |
| Tidak ada kebijakan otorisasi bernama | DAB tidak mendukung kebijakan bernama ASP.NET/HotChocolate-style |
Troubleshooting
Klaim tidak ditemukan (403 Terlarang)
Jika permintaan gagal dengan 403 Forbidden, verifikasi:
- Klaim ada dalam token akses
- Nama klaim sama persis (sensitif terhadap huruf besar/kecil)
- Penyedia identitas dikonfigurasi untuk menyertakan klaim
Kebijakan tidak diterapkan
Jika hasil tidak difilter:
- Verifikasi bahwa nama peran sesuai dengan nilai header
X-MS-API-ROLE - Konfirmasikan bahwa tindakan (baca, perbarui, hapus) telah ditentukan dalam kebijakan
- Periksa apakah autentikasi dikonfigurasi dan permintaan diautentikasi
Kesalahan sintaksis
Jika mesin melaporkan kesalahan penguraian kebijakan:
- Verifikasi ekspresi menggunakan sintaks OData (
eq, ,ne,andor) - Periksa apakah nama bidang cocok dengan nama API yang dipetakan (bukan nama kolom database)
- Pastikan nilai string diapit dalam tanda kutip tunggal