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.