RBAC
Rol Tanımı
[role_definition]
, RBAC rolü miras ilişkilerini tanımlamak için kullanılır. Casbin, kullanıcıların roller ve miras ilişkilerine sahip olduğu ve kaynakların da roller ve miras ilişkilerine sahip olduğu birden fazla RBAC sistemini destekler. Bu iki RBAC sistemi birbirini etkilemeyecektir.
Bu bölüm isteğe bağlıdır. Modelde RBAC rollerini kullanmıyorsanız, bu bölümü atlayın.
[role_definition]
g = _, _
g2 = _, _
Yukarıdaki rol tanımı, g
'nin bir RBAC sistemi olduğunu ve g2
'nin başka bir RBAC sistemi olduğunu gösterir. _,_
anlamı, miras ilişkisinde iki tarafın yer aldığıdır. En yaygın durumda, eğer kullanıcılar için sadece rollrelere ihtiyacınız varsa genellikle g
'yi tek başına kullanırsınız. Hem kullanıcılar hem de kaynaklar için rolleri (veya grupları) gerektiğinde hem g
hem de g2
kullanabilirsiniz. Örnekler için lütfen rbac_model.conf ve rbac_model_with_resource_roles.conf dosyalarına bakın.
Casbin, gerçek kullanıcı-rol eşleştirmeyi (veya kaynaklar üzerindeki rolleri kullanıyorsanız kaynak-rol eşleştirmeyi) politika içinde saklar. Örneğin:
p, data2_admin, data2, read
g, alice, data2_admin
Bu, alice
'in data2_admin
rolünün üyesi/mirasçısı olduğu anlamına gelir. Burada, alice
bir kullanıcı, bir kaynak veya bir rol olabilir. Casbin sadece onu bir dize olarak tanır.
Ardından, bir eşleştiricide, rolü aşağıda gösterildiği gibi kontrol etmelisiniz:
[matchers]
m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act
Bu, istekteki sub
un politikada sub
rolüne sahip olması gerektiği anlamına gelir.
- Casbin sadece kullanıcı-rol eşleştirmesini saklar.
- Casbin, bir kullanıcının geçerli bir kullanıcı olup olmadığını veya bir rolün geçerli bir rol olup olmadığını doğrulamaz. Bu, kimlik doğrulama tarafından halledilmelidir.
- Bir RBAC sisteminde bir kullanıcı ve bir rol için aynı ismi kullanmayın, çünkü Casbin kullanıcıları ve rolleri dizeler olarak tanır ve Casbin'in sizin
alice
kullanıcısını mı yoksaalice
rolünü mü belirttiğinizi anlamak için bir yolu yoktur. Bunurole_alice
kullanarak basitçe çözebilirsiniz. - Eğer
A
rolB
ye sahipse veB
rolC
ye sahipse, o zamanA
rolC
ye sahiptir. Bu geçişlilik şu an için sonsuzdur.
Geleneksel olarak, politika tanımındaki konu simge adı sub
olup başta yer alır. Şimdi, Golang Casbin özelleştirilmiş simge adlarını ve yerlerini desteklemektedir. Eğer konu simge adı sub
ise, konu simgesi herhangi bir ek eylem gerektirmeden rastgele bir yere yerleştirilebilir. Eğer konu simge adı sub
değilse, e.SetFieldIndex()
metodu constant.SubjectIndex
için zorunlu olarak uygulayıcı başlatıldıktan sonra çağrılmalıdır, konumundan bağımsız olarak.
# `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
Rol Hiyerarşisi
Casbin'in RBAC'ı, RBAC1'in rol hiyerarşisi özelliğini destekler; bu, alice
'in role1
'e sahip olması ve role1
'in role2
'ye sahip olması durumunda, alice
'in de role2
'ye sahip olacağı ve izinlerini miras alacağı anlamına gelir.
Burada, hiyerarşi seviyesi adında bir kavramımız var. Yani, bu örnekte hiyerarşi seviyesi 2'dir. Casbin'deki yerleşik rol yöneticisi için, maksimum hiyerarşi seviyesini belirtebilirsiniz. Varsayılan değer 10'dur. Bu, alice
gibi bir son kullanıcının sadece 10 seviye rol miras alabileceği anlamına gelir.
// 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
}
Rolü Kullanıcıdan Nasıl Ayırt Ederiz?
Casbin, RBAC'de roller ve kullanıcılar arasında ayrım yapmaz. İkisi de dizeler olarak ele alınır. Eğer sadece tek seviyeli bir RBAC kullanıyorsanız (bir rol asla başka bir rolün üyesi olmayacak), tüm kullanıcıları almak için e.GetAllSubjects()
ve tüm rolleri almak için e.GetAllRoles()
kullanabilirsiniz. Bunlar, sırasıyla, tüm g, u, r
kurallarındaki tüm u
ve tüm r
'leri listeleyecektir.
Ancak eğer çok seviyeli bir RBAC (rol hiyerarşisi ile) kullanıyorsanız ve uygulamanız bir ismin (dizenin) kullanıcı mı yoksa rol mu olduğunu kaydetmiyorsa veya aynı isme sahip bir kullanıcı ve rolunuz varsa, Casbin'e geçirmeden önce rolün önüne role::admin
gibi bir ön ek ekleyebilirsiniz. Bu şekilde, bu öneki kontrol ederek bir rol olup olmadığını anlayabilirsiniz.
Örtük Rolleri veya İzinleri Nasıl Sorgularım?
Bir kullanıcı, bir politika kuralında doğrudan atanmak yerine RBAC hiyerarşisi aracılığıyla bir rol veya izin miras aldığında, bu tür bir atamaya "örtülü" (implicit) denir. Bu tür örtülü ilişkileri sorgulamak için, GetRolesForUser()
ve GetPermissionsForUser()
yerine GetImplicitRolesForUser()
ve GetImplicitPermissionsForUser()
API'lerini kullanmanız gerekir. Daha fazla ayrıntı için, lütfen bu GitHub sorununa bakın.
RBAC'ta Desen Eşleştirme Kullanımı
Desenli RBAC bölümüne bakın
Rol Yöneticisi
Ayrıntılar için Rol Yöneticileri bölümüne bakın.