RBAC
Định nghĩa Vai trò
[role_definition]
được sử dụng để định nghĩa mối quan hệ thừa kế vai trò RBAC. Casbin hỗ trợ nhiều hệ thống RBAC, trong đó người dùng có thể có vai trò và mối quan hệ thừa kế của chúng, và tài nguyên cũng có thể có vai trò và mối quan hệ thừa kế của chúng. Hai hệ thống RBAC này sẽ không ảnh hưởng đến nhau.
Phần này là tùy chọn. Nếu bạn không sử dụng các vai trò RBAC trong mô hình, thì bỏ qua phần này.
[role_definition]
g = _, _
g2 = _, _
Định nghĩa vai trò ở trên cho thấy rằng g
là một hệ thống RBAC, và g2
là một hệ thống RBAC khác. _,_
có nghĩa là có hai bên tham gia vào một mối quan hệ kế thừa. Trong trường hợp phổ biến nhất, bạn thường sử dụng g
một mình nếu bạn chỉ cần vai trò cho người dùng. Bạn cũng có thể sử dụng cả g
và g2
khi bạn cần vai trò (hoặc nhóm) cho cả người dùng và tài nguyên. Vui lòng xem rbac_model.conf và rbac_model_with_resource_roles.conf để tìm ví dụ.
Casbin lưu trữ ánh xạ thực tế giữa người dùng và vai trò (hoặc ánh xạ vai trò tài nguyên nếu bạn đang sử dụng vai trò trên tài nguyên) trong chính sách. Ví dụ:
p, data2_admin, data2, read
g, alice, data2_admin
Điều này có nghĩa là alice
kế thừa/là thành viên của vai trò data2_admin
. Ở đây, alice
có thể là một người dùng, một tài nguyên, hoặc một vai trò. Casbin chỉ nhận biết nó như một chuỗi.
Sau đó, trong một bộ so khớp, bạn nên kiểm tra vai trò như được hiển thị bên dưới:
[matchers]
m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act
Điều đó có nghĩa là sub
trong yêu cầu nên có vai trò sub
trong chính sách.
- Casbin chỉ lưu trữ ánh xạ người dùng-vai trò.
- Casbin không xác minh xem một người dùng có phải là người dùng hợp lệ hay một vai trò có phải là vai trò hợp lệ hay không. Điều đó nên được quan tâm bởi xác thực.
- Không nên sử dụng cùng một tên cho một người dùng và một vai trò trong một hệ thống RBAC, bởi vì Casbin nhận biết người dùng và vai trò như các chuỗi, và không có cách nào để Casbin biết liệu bạn đang chỉ định người dùng
alice
hay vai tròalice
. Bạn có thể giải quyết nó một cách đơn giản bằng cách sử dụngrole_alice
. - Nếu
A
có vai tròB
, vàB
có vai tròC
, thìA
có vai tròC
. Tính chuyển tiếp này là vô hạn cho đến nay.
Theo quy ước, tên token chủ đề trong định nghĩa chính sách là sub
và được đặt ở đầu. Bây giờ, Golang Casbin hỗ trợ tùy chỉnh tên token và vị trí. Nếu tên token chủ đề là sub
, token chủ đề có thể được đặt ở bất kỳ vị trí nào mà không cần bất kỳ hành động bổ sung nào. Nếu tên token chủ đề không phải là sub
, e.SetFieldIndex()
cho constant.SubjectIndex
nên được gọi sau khi enforcer được khởi tạo, bất kể vị trí của nó.
# `subject` here is for sub
[policy_definition]
p = obj, act, subject
e.SetFieldIndex("p", constant.SubjectIndex, 2) // index starts from 0
ok, err := e.DeleteUser("alice") // without SetFieldIndex, it will raise an error
Hệ Thống Phân Cấp Vai Trò
Casbin's RBAC hỗ trợ tính năng phân cấp vai trò của RBAC1, có nghĩa là nếu alice
có role1
, và role1
có role2
, thì alice
cũng sẽ có role2
và kế thừa các quyền của nó.
Ở đây, chúng ta có một khái niệm gọi là mức độ phân cấp. Vì vậy, trong ví dụ này, mức độ phân cấp là 2. Đối với trình quản lý vai trò tích hợp sẵn trong Casbin, bạn có thể chỉ định mức độ phân cấp tối đa. Giá trị mặc định là 10. Điều này có nghĩa là một người dùng cuối như alice
chỉ có thể kế thừa tối đa 10 cấp độ vai trò.
// NewRoleManager is the constructor for creating an instance of the
// default RoleManager implementation.
func NewRoleManager(maxHierarchyLevel int) rbac.RoleManager {
rm := RoleManager{}
rm.allRoles = &sync.Map{}
rm.maxHierarchyLevel = maxHierarchyLevel
rm.hasPattern = false
return &rm
}
Làm thế nào để phân biệt Vai trò và Người dùng?
Casbin không phân biệt giữa vai trò và người dùng trong RBAC của nó. Cả hai đều được coi là chuỗi ký tự. Nếu bạn chỉ sử dụng RBAC một cấp (nơi mà một vai trò sẽ không bao giờ là thành viên của một vai trò khác), bạn có thể sử dụng e.GetAllSubjects()
để lấy tất cả người dùng và e.GetAllRoles()
để lấy tất cả vai trò. Chúng sẽ liệt kê tất cả u
và tất cả r
, tương ứng, trong tất cả các quy tắc g, u, r
.
Nhưng nếu bạn đang sử dụng RBAC đa cấp (với cấu trúc phân cấp vai trò) và ứng dụng của bạn không ghi nhận xem một tên (chuỗi) là người dùng hay vai trò, hoặc bạn có một người dùng và một vai trò cùng tên, bạn có thể thêm một tiền tố cho vai trò như role::admin
trước khi truyền nó vào Casbin. Bằng cách này, bạn sẽ biết đó là một vai trò bằng cách kiểm tra tiền tố này.
Làm thế nào để truy vấn Vai trò hoặc Quyền ẩn?
Khi người dùng kế thừa một vai trò hoặc quyền thông qua hệ thống phân cấp RBAC thay vì được gán trực tiếp chúng trong một quy tắc chính sách, chúng ta gọi kiểu gán này là "ngầm định". Để truy vấn các mối quan hệ ngầm định như vậy, bạn cần sử dụng hai API này: GetImplicitRolesForUser()
và GetImplicitPermissionsForUser()
thay vì GetRolesForUser()
và GetPermissionsForUser()
. Để biết thêm chi tiết, vui lòng xem vấn đề GitHub này.
Sử dụng Pattern Matching trong RBAC
Xem RBAC với Pattern
Quản lý Vai trò
Xem phần Quản lý Vai trò để biết chi tiết.