// Package rbac implementiert Core RBAC-01: das Rollenmodell mit // Grundrollen/-rechten, Hierarchie und Zuweisung. Die eigentliche // Durchsetzung (erlaubt/verboten je Request) ist RBAC-02, dieses Paket // liefert nur Modell + Zuweisung (Casbin-Prinzip: Policy-Modell getrennt // von der Entscheidungsfunktion). package rbac // Role ist eine der drei Grundrollen. Superadmin lebt mandantenuebergreifend // (siehe internal/user.SuperadminStore aus IAM-01) und wird deshalb NICHT // ueber Store (tenant-gescoped) zugewiesen — die Existenz eines Superadmin- // Kontos IST die Rollenzuweisung. type Role string const ( RoleSuperadmin Role = "superadmin" RoleTenantAdmin Role = "tenant_admin" RoleUser Role = "user" ) type Permission string const ( PermSelfRead Permission = "self.read" PermSelfUpdate Permission = "self.update" PermManageUsers Permission = "tenant.manage_users" PermManageSettings Permission = "tenant.manage_settings" PermManageTenants Permission = "platform.manage_tenants" ) // parent bildet die Rollenhierarchie ab (Akzeptanzkriterium 2): eine Rolle // erbt alle Rechte ihrer Elternrolle. tenant_admin erbt von user, // superadmin erbt von tenant_admin. var parent = map[Role]Role{ RoleTenantAdmin: RoleUser, RoleSuperadmin: RoleTenantAdmin, } // direct sind die einer Rolle direkt (ohne Vererbung) zugeordneten Rechte. var direct = map[Role][]Permission{ RoleUser: {PermSelfRead, PermSelfUpdate}, RoleTenantAdmin: {PermManageUsers, PermManageSettings}, RoleSuperadmin: {PermManageTenants}, } // EffectivePermissions liefert die vollstaendige, ueber die Hierarchie // aufgeloeste Rechtemenge einer Rolle (Akzeptanzkriterium 2 / Pruefung 2). func EffectivePermissions(role Role) []Permission { seen := make(map[Permission]bool) var out []Permission for r, ok := role, true; ok; r, ok = parent[r] { for _, p := range direct[r] { if !seen[p] { seen[p] = true out = append(out, p) } } } return out } // HasPermission prueft, ob eine Rolle (inklusive geerbter Rechte) ein // bestimmtes Recht besitzt. func HasPermission(role Role, perm Permission) bool { for _, p := range EffectivePermissions(role) { if p == perm { return true } } return false }