233 lines
6.1 KiB
Markdown
233 lines
6.1 KiB
Markdown
|
# Erişim Kontrol Listesi
|
|||
|
|
|||
|
Erişim Kontrol Listesi, Nocobase'deki izin kontrol modülüdür. Erişim Kontrol Listesinde rolleri, kaynakları kaydettikten ve karşılık gelen izinleri yapılandırdıktan sonra, rollerin izinlerini değerlendirebilirsiniz.
|
|||
|
|
|||
|
## Kavram Açıklaması
|
|||
|
|
|||
|
* rol (`ACLRole`): izin kararının nesnesi
|
|||
|
* Kaynak (`ACLResource`): Nocobase Erişim Kontrol Listesinde, kaynak genellikle Restful API'deki Resource'a kavramsal olarak benzer olabilen bir veritabanı tablosuna karşılık gelir.
|
|||
|
* İşlem: "Oluştur", "oku", "güncelle", "sil" vb. gibi kaynaklar üzerindeki işlemler.
|
|||
|
* Strateji (`ACLAvailableStrategy`): Genellikle her rolün varsayılan kullanıcı izinlerini tanımlayan kendi izin stratejisi vardır.
|
|||
|
* Grant: `Action`a rol erişimi vermek için `ACLRole` örneğinde `grantAction` işlevini çağırın.
|
|||
|
* Kimlik Doğrulama: `ACL` örneğinde `can` işlevi çağrılır ve işlev tarafından döndürülen sonuç, kullanıcının kimlik doğrulama sonucudur.
|
|||
|
|
|||
|
|
|||
|
## sınıf yöntemi
|
|||
|
|
|||
|
### `constructor()`
|
|||
|
|
|||
|
Bir `ACL` örneği oluşturan oluşturucu.
|
|||
|
|
|||
|
```typescript
|
|||
|
import { ACL } from '@nocobase/database';
|
|||
|
|
|||
|
const acl = new ACL();
|
|||
|
```
|
|||
|
|
|||
|
### `define()`
|
|||
|
|
|||
|
Bir ACL rolü tanımlayın
|
|||
|
|
|||
|
**Kullanım**
|
|||
|
* `define(options: DefineOptions): ACLRole`
|
|||
|
|
|||
|
**Tip**
|
|||
|
|
|||
|
```typescript
|
|||
|
interface DefineOptions {
|
|||
|
role: string;
|
|||
|
allowConfigure?: boolean;
|
|||
|
strategy?: string | AvailableStrategyOptions;
|
|||
|
actions?: ResourceActionsOptions;
|
|||
|
routes?: any;
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
**Detaylar**
|
|||
|
|
|||
|
* `role` - 角色名称
|
|||
|
|
|||
|
```typescript
|
|||
|
// Yönetici adında bir rol tanımlayın
|
|||
|
acl.define({
|
|||
|
role: 'admin',
|
|||
|
});
|
|||
|
```
|
|||
|
|
|||
|
* `allowConfigure` - Yapılandırma izinlerine izin verilip verilmeyeceği
|
|||
|
* `strategy` - Rol İzin Politikası
|
|||
|
* Tanımlanan stratejinin kullanılacağını belirten, kullanılacak stratejinin adı olan bir `string` olabilir.
|
|||
|
* `AvailableStrategyOptions` için bu rol için yeni bir strateji tanımlanabilir, bkz. [`setAvailableActions()`](#setavailableactions).
|
|||
|
* `işlemler` - Bir rol tanımlarken, rol için erişilebilir bir `işlemler` nesnesi iletebilirsiniz.
|
|||
|
Bundan sonra, kaynak izinlerini vermek için sırayla `aclRole.grantAction` çağrılır. Bkz. [`aclRole.grantAction`](./acl-role.md#grantaction)
|
|||
|
|
|||
|
```typescript
|
|||
|
acl.define({
|
|||
|
role: 'admin',
|
|||
|
actions: {
|
|||
|
'posts:edit': {}
|
|||
|
},
|
|||
|
});
|
|||
|
// Diğer kullanım şekli
|
|||
|
const role = acl.define({
|
|||
|
role: 'admin',
|
|||
|
});
|
|||
|
|
|||
|
role.grantAction('posts:edit', {});
|
|||
|
```
|
|||
|
|
|||
|
### `getRole()`
|
|||
|
|
|||
|
Rol adına göre kayıtlı rol nesnesini döndürür
|
|||
|
|
|||
|
**Kullanım**
|
|||
|
* `getRole(name: string): ACLRole`
|
|||
|
|
|||
|
### `removeRole()`
|
|||
|
|
|||
|
Rol adına göre rolleri kaldırın
|
|||
|
|
|||
|
**Kullanım**
|
|||
|
* `removeRole(name: string)`
|
|||
|
|
|||
|
### `can()`
|
|||
|
Kimlik doğrulama işlevi
|
|||
|
|
|||
|
**Kullanım**
|
|||
|
* `can(options: CanArgs): CanResult | null`
|
|||
|
|
|||
|
**Tip**
|
|||
|
|
|||
|
```typescript
|
|||
|
interface CanArgs {
|
|||
|
role: string; // Rol ismi
|
|||
|
resource: string; // Kaynak Adı
|
|||
|
action: string; // İşlem adı
|
|||
|
}
|
|||
|
|
|||
|
interface CanResult {
|
|||
|
role: string; // Rol ismi
|
|||
|
resource: string; // Kaynak Adı
|
|||
|
action: string; // İşlem adı
|
|||
|
params?: any; // İzinler kaydedilirken gönderilen parametreler
|
|||
|
}
|
|||
|
|
|||
|
```
|
|||
|
|
|||
|
**Detaylar**
|
|||
|
|
|||
|
`can` yöntemi öncelikle rolün kayıt için ilgili `Action` iznine sahip olup olmadığını belirleyecek ve değilse, rolün `strategy` eşleşip eşleşmediğini belirleyecektir.
|
|||
|
Çağrı `null` döndürdüğünde, rolün izni olmadığını belirtir, aksi takdirde, rolün izne sahip olduğunu belirten bir `CanResult` nesnesi döndürür.
|
|||
|
|
|||
|
**Örnek**
|
|||
|
```typescript
|
|||
|
// Rolleri tanımlayın, izinleri kaydedin
|
|||
|
acl.define({
|
|||
|
role: 'admin',
|
|||
|
actions: {
|
|||
|
'posts:edit': {
|
|||
|
fields: ['title', 'content'],
|
|||
|
},
|
|||
|
},
|
|||
|
});
|
|||
|
|
|||
|
const canResult = acl.can({
|
|||
|
role: 'admin',
|
|||
|
resource: 'posts',
|
|||
|
action: 'edit',
|
|||
|
});
|
|||
|
/**
|
|||
|
* canResult = {
|
|||
|
* role: 'admin',
|
|||
|
* resource: 'posts',
|
|||
|
* action: 'edit',
|
|||
|
* params: {
|
|||
|
* fields: ['title', 'content'],
|
|||
|
* }
|
|||
|
* }
|
|||
|
*/
|
|||
|
|
|||
|
acl.can({
|
|||
|
role: 'admin',
|
|||
|
resource: 'posts',
|
|||
|
action: 'destroy',
|
|||
|
}); // null
|
|||
|
```
|
|||
|
### `use()`
|
|||
|
|
|||
|
**Kullanım**
|
|||
|
* `use(fn: any)`
|
|||
|
Ara katman yazılımlarına ara katman işlevleri ekleyin.
|
|||
|
|
|||
|
### `middleware()`
|
|||
|
|
|||
|
`@nocobase/server` içinde kullanım için bir ara katman işlevi döndürür. Bu `ara yazılımı` kullandıktan sonra, `@nocobase/server`, her istek işlenmeden önce izin kararı verecektir.
|
|||
|
|
|||
|
### `allow()`
|
|||
|
|
|||
|
Kaynağı herkese açık hale getirin
|
|||
|
|
|||
|
**Kullanım**
|
|||
|
* `allow(resourceName: string, actionNames: string[] | string, condition?: string | ConditionFunc)`
|
|||
|
|
|||
|
**Tip**
|
|||
|
```typescript
|
|||
|
type ConditionFunc = (ctx: any) => Promise<boolean> | boolean;
|
|||
|
```
|
|||
|
|
|||
|
**Detaylar**
|
|||
|
|
|||
|
* resourceName - Kaynak Adı
|
|||
|
* actionNames - kaynak işlem adı
|
|||
|
* condition? - Konfigürasyon Etkili Koşullar
|
|||
|
* `string` iletmek, tanımlanan koşulun kullanıldığını ve kayıt koşulunun `acl.allowManager.registerCondition` yöntemini kullandığını gösterir.
|
|||
|
```typescript
|
|||
|
acl.allowManager.registerAllowCondition('superUser', async () => {
|
|||
|
return ctx.state.user?.id === 1;
|
|||
|
});
|
|||
|
|
|||
|
// superUser durumu için users:list yetkilerini açar
|
|||
|
acl.allow('users', 'list', 'superUser');
|
|||
|
```
|
|||
|
* ConditionFunc'u ctx parametresiyle iletir ve sonucunu `boolean` olarak döndürür.
|
|||
|
```typescript
|
|||
|
// Kullanıcı kimliği 1 olduğunda, user:list'e erişebilirsiniz.
|
|||
|
acl.allow('users', 'list', (ctx) => {
|
|||
|
return ctx.state.user?.id === 1;
|
|||
|
});
|
|||
|
```
|
|||
|
|
|||
|
**Örnek**
|
|||
|
|
|||
|
```typescript
|
|||
|
// users:login erişim yetkisi olanlar erişebilir.
|
|||
|
acl.allow('users', 'login');
|
|||
|
```
|
|||
|
|
|||
|
### `setAvailableActions()`
|
|||
|
|
|||
|
**Kullanım**
|
|||
|
|
|||
|
* `setAvailableStrategy(name: string, options: AvailableStrategyOptions)`
|
|||
|
|
|||
|
Kullanılabilir bir izin politikası kaydedin
|
|||
|
|
|||
|
**Tip**
|
|||
|
|
|||
|
```typescript
|
|||
|
interface AvailableStrategyOptions {
|
|||
|
displayName?: string;
|
|||
|
actions?: false | string | string[];
|
|||
|
allowConfigure?: boolean;
|
|||
|
resource?: '*';
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
**Detaylar**
|
|||
|
|
|||
|
* displayName - Politika Adı
|
|||
|
* allowConfigure - Bu politikanın **config source** izni olup olmadığına bakılmaksızın, bunu `true` olarak ayarladıktan sonra, `ACL`de bir `configResources` kaynağı olarak kaydolma iznini belirleme isteği bir geçiş döndürür.
|
|||
|
* actions - Politika içindeki işlemler listesi joker karakteri `*` destekler
|
|||
|
* resource - Politika içindeki kaynak tanımı joker karakteri `*` destekler
|
|||
|
|