Ana içeriğe atla

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 subun politikada sub rolüne sahip olması gerektiği anlamına gelir.

not
  1. Casbin sadece kullanıcı-rol eşleştirmesini saklar.
  2. 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.
  3. 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ı yoksa alice rolünü mü belirttiğinizi anlamak için bir yolu yoktur. Bunu role_alice kullanarak basitçe çözebilirsiniz.
  4. Eğer A rol Bye sahipse ve B rol Cye sahipse, o zaman A rol Cye sahiptir. Bu geçişlilik şu an için sonsuzdur.
Simge Adı Kuralı

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.