62 lines
2.5 KiB
Diff
62 lines
2.5 KiB
Diff
# UNDF: UNDF-2026-000000275
|
|
--- a/src/rbac/engine/mod.rs
|
|
+++ b/src/rbac/engine/mod.rs
|
|
@@ -26,6 +26,8 @@ pub struct RbacEngine {
|
|
resources: HashMap<ResourceRequest, Resource>,
|
|
permissions: HashMap<PermissionRequest, Permission>,
|
|
wildcard_resources: HashMap<ResourceId, Resource>,
|
|
wildcard_permissions: HashMap<PermissionId, Permission>,
|
|
+ permissions_by_id: HashMap<PermissionId, Permission>,
|
|
+ resources_by_id: HashMap<ResourceId, Resource>,
|
|
roles: HashMap<RoleId, Role>,
|
|
user_roles: HashMap<UserId, RoleId>,
|
|
role_permissions: HashMap<RoleId, HashSet<(PermissionId, ResourceId)>>,
|
|
@@ -88,6 +90,12 @@ impl RbacEngine {
|
|
permissions.insert(permission.clone().into(), permission);
|
|
}
|
|
|
|
+ let permissions_by_id: HashMap<PermissionId, Permission> =
|
|
+ permissions.values().map(|p| (p.id, p.clone())).collect();
|
|
+ let resources_by_id: HashMap<ResourceId, Resource> =
|
|
+ resources.values().map(|r| (r.id, r.clone())).collect();
|
|
+
|
|
let roles: HashMap<RoleId, Role> = roles_rows.into_iter().map(|r| (r.id, r)).collect();
|
|
|
|
@@ -120,6 +128,8 @@ impl RbacEngine {
|
|
RbacEngine {
|
|
resources,
|
|
permissions,
|
|
wildcard_resources,
|
|
wildcard_permissions,
|
|
+ permissions_by_id,
|
|
+ resources_by_id,
|
|
roles,
|
|
user_roles,
|
|
role_permissions,
|
|
@@ -224,19 +234,16 @@ impl RbacEngine {
|
|
let mut map: HashMap<ResourceId, (Resource, Vec<Permission>)> = Default::default();
|
|
|
|
for item in items {
|
|
- let permission = if let Some(p) = self.wildcard_permissions.get(&item.1) {
|
|
+ let permission = if let Some(p) = self.wildcard_permissions.get(&item.1) {
|
|
p
|
|
} else {
|
|
- self.permissions
|
|
- .values()
|
|
- .find(|p| p.id == item.1)
|
|
+ self.permissions_by_id
|
|
+ .get(&item.1)
|
|
.ok_or_else(|| Error::PermissionNotFound(format!("{:?}", item.1)))?
|
|
};
|
|
|
|
- let resource = if let Some(r) = self.wildcard_resources.get(&item.0) {
|
|
+ let resource = if let Some(r) = self.wildcard_resources.get(&item.0) {
|
|
r
|
|
} else {
|
|
- self.resources
|
|
- .values()
|
|
- .find(|r| r.id == item.0)
|
|
+ self.resources_by_id
|
|
+ .get(&item.0)
|
|
.ok_or_else(|| Error::ResourceNotFound(format!("{:?}", item.0)))?
|
|
};
|