Bỏ qua đến nội dung chính

How It Works

Trong Casbin, một mô hình kiểm soát truy cập được trừu tượng hóa thành một tệp CONF dựa trên mô hình PERM (Policy, Effect, Request, Matchers). Chuyển đổi hoặc nâng cấp cơ chế ủy quyền cho một dự án đơn giản như sửa đổi một cấu hình. Bạn có thể tùy chỉnh mô hình kiểm soát truy cập của riêng mình bằng cách kết hợp các mô hình có sẵn. Ví dụ, bạn có thể kết hợp vai trò RBAC và thuộc tính ABAC lại với nhau trong một mô hình và chia sẻ một tập hợp các quy tắc chính sách.

Mô hình PERM bao gồm bốn nền tảng: Policy, Effect, Request, và Matchers. Những nền tảng này mô tả mối quan hệ giữa tài nguyên và người dùng.

Request

Định nghĩa các tham số yêu cầu. Một yêu cầu cơ bản là một đối tượng tuple, yêu cầu ít nhất một chủ đề (thực thể được truy cập), đối tượng (tài nguyên được truy cập) và hành động (phương thức truy cập).

Ví dụ, một định nghĩa yêu cầu có thể trông như thế này:

Định nghĩa này chỉ định tên và thứ tự của các tham số yêu cầu bởi hàm so khớp kiểm soát truy cập.

Policy

Định nghĩa mô hình cho chiến lược truy cập. Nó chỉ định tên và thứ tự của các trường trong tài liệu quy tắc Chính sách.

Ví dụ:

Lưu ý: Nếu eft (kết quả chính sách) không được định nghĩa, trường kết quả trong tệp chính sách sẽ không được đọc và kết quả so khớp chính sách sẽ được cho phép theo mặc định.

Matcher

Xác định các quy tắc khớp cho Yêu cầu và Chính sách.

Ví dụ: m = r.sub == p.sub && r.act == p.act && r.obj == p.obj Kết quả của chiến lược sẽ được lưu trong p.eft.

Effect

Thực hiện phép kết hợp logic để đánh giá kết quả khớp của Matchers.

Ví dụ: e = some(where(p.eft == allow))

Câu lệnh này có nghĩa là nếu kết quả của chiến lược khớp p.eft có kết quả là (một số) cho phép, thì kết quả cuối cùng là đúng.

Hãy xem xét một ví dụ khác:

e = some(where (p.eft == allow)) && !some(where (p.eft == deny))

Ý nghĩa logic của sự kết hợp ví dụ này là: nếu có một chiến lược khớp với kết quả của allow và không có chiến lược nào khớp với kết quả của deny, kết quả là true. Nói cách khác, nó là true khi tất cả các chiến lược khớp đều là allow. Nếu có bất kỳ deny nào, cả hai đều false (đơn giản hơn, khi allow và deny tồn tại cùng lúc, deny sẽ ưu tiên).

Mô hình cơ bản và đơn giản nhất trong Casbin là ACL. Mô hình CONF cho ACL như sau:

# Request definition
[request_definition]
r = sub, obj, act

# Policy definition
[policy_definition]
p = sub, obj, act

# Policy effect
[policy_effect]
e = some(where (p.eft == allow))

# Matchers
[matchers]
m = r.sub == p.sub && r.obj == p.obj && r.act == p.act

Một ví dụ về chính sách cho mô hình ACL là:

p, alice, data1, read
p, bob, data2, write

Điều này có nghĩa là:

  • alice có thể đọc data1
  • bob có thể ghi data2

Chúng tôi cũng hỗ trợ chế độ nhiều dòng bằng cách thêm '' ở cuối:

# Matchers
[matchers]
m = r.sub == p.sub && r.obj == p.obj \
&& r.act == p.act

Hơn nữa, nếu bạn đang sử dụng ABAC, bạn có thể thử toán tử 'in' như được trình bày trong ví dụ sau cho phiên bản golang của Casbin (jCasbin và Node-Casbin chưa được hỗ trợ):

# Matchers
[matchers]
m = r.obj == p.obj && r.act == p.act || r.obj in ('data2', 'data3')

Nhưng bạn PHẢI đảm bảo rằng độ dài của mảng là LỚN HƠN 1, nếu không nó sẽ gây ra sự cố panic.

Để biết thêm về các toán tử, bạn có thể xem tại govaluate.