Skip to content

Commit 66980ba

Browse files
authored
feat(rbac): load filtered policies before enforcing (#1387)
1 parent bc601d7 commit 66980ba

File tree

4 files changed

+436
-436
lines changed

4 files changed

+436
-436
lines changed
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# ========== basic type permission policies ========== #
2+
# case 1
3+
p, user:default/known_user, test.resource.deny, use, deny
4+
# case 2 is about user without listed permissions
5+
# case 3
6+
p, user:default/duplicated, test.resource, use, allow
7+
p, user:default/duplicated, test.resource, use, deny
8+
# case 4
9+
p, user:default/known_user, test.resource, use, allow
10+
# case 5
11+
unknown user
12+
13+
# ========== resource type permission policies ========== #
14+
# case 1
15+
p, user:default/known_user, test-resource-deny, update, deny
16+
# case 2 is about user without listed permissions
17+
# case 3
18+
p, user:default/duplicated, test-resource, update, allow
19+
p, user:default/duplicated, test-resource, update, deny
20+
# case 4
21+
p, user:default/known_user, test-resource, update, allow
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
# basic type permission policies
2+
### Let's deny 'use' action for 'test.resource' for group:default/data_admin
3+
p, group:default/data_admin, test.resource, use, deny
4+
5+
# case1:
6+
# g, user:default/alice, group:default/data_admin
7+
p, user:default/alice, test.resource, use, allow
8+
9+
# case2:
10+
# g, user:default/akira, group:default/data_admin
11+
12+
# case3:
13+
# g, user:default/antey, group:default/data_admin
14+
p, user:default/antey, test.resource, use, deny
15+
16+
### Let's allow 'use' action for 'test.resource' for group:default/data_read_admin
17+
p, group:default/data_read_admin, test.resource, use, allow
18+
19+
# case4:
20+
# g, user:default/julia, group:default/data_read_admin
21+
p, user:default/julia, test.resource, use, allow
22+
23+
# case5:
24+
# g, user:default/mike, group:default/data_read_admin
25+
26+
# case6:
27+
# g, user:default/tom, group:default/data_read_admin
28+
p, user:default/tom, test.resource, use, deny
29+
30+
31+
# resource type permission policies
32+
### Let's deny 'read' action for 'test.resource' permission for group:default/data_admin
33+
p, group:default/data_admin, test-resource, read, deny
34+
35+
# case1:
36+
# g, user:default/alice, group:default/data_admin
37+
p, user:default/alice, test-resource, read, allow
38+
39+
# case2:
40+
# g, user:default/akira, group:default/data_admin
41+
42+
# case3:
43+
# g, user:default/antey, group:default/data_admin
44+
p, user:default/antey, test-resource, read, deny
45+
46+
### Let's allow 'read' action for 'test-resource' permission for group:default/data_read_admin
47+
p, group:default/data_read_admin, test-resource, read, allow
48+
49+
# case4:
50+
# g, user:default/julia, group:default/data_read_admin
51+
p, user:default/julia, test-resource, read, allow
52+
53+
# case5:
54+
# g, user:default/mike, group:default/data_read_admin
55+
56+
# case6:
57+
# g, user:default/tom, group:default/data_read_admin
58+
p, user:default/tom, test-resource, read, deny
59+
60+
61+
# group inheritance:
62+
# g, group:default/data-read-admin, group:default/data_parent_admin
63+
# and we know case5:
64+
# g, user:default/mike, data-read-admin
65+
66+
p, group:default/data_parent_admin, test.resource.2, use, allow
67+
p, group:default/data_parent_admin, test-resource, create, allow

plugins/rbac-backend/src/service/enforcer-delegate.ts

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { NotAllowedError, NotFoundError } from '@backstage/errors';
22

3-
import { Enforcer } from 'casbin';
3+
import { Enforcer, newEnforcer, newModelFromString } from 'casbin';
44
import { Knex } from 'knex';
55

66
import {
@@ -17,6 +17,7 @@ import {
1717
RoleMetadataStorage,
1818
} from '../database/role-metadata';
1919
import { policiesToString, policyToString } from '../helper';
20+
import { MODEL } from './permission-model';
2021

2122
export class EnforcerDelegate {
2223
constructor(
@@ -534,7 +535,26 @@ export class EnforcerDelegate {
534535
resourceType: string,
535536
action: string,
536537
): Promise<boolean> {
537-
return await this.enforcer.enforce(entityRef, resourceType, action);
538+
const filter = [
539+
{
540+
ptype: 'p',
541+
v1: resourceType,
542+
v2: action,
543+
},
544+
{
545+
ptype: 'g',
546+
v0: entityRef,
547+
},
548+
];
549+
550+
const adapt = this.enforcer.getAdapter();
551+
const roleManager = this.enforcer.getRoleManager();
552+
const tempEnforcer = await newEnforcer(newModelFromString(MODEL), adapt);
553+
tempEnforcer.setRoleManager(roleManager);
554+
555+
await tempEnforcer.loadFilteredPolicy(filter);
556+
557+
return await tempEnforcer.enforce(entityRef, resourceType, action);
538558
}
539559

540560
async getMetadata(policy: string[]): Promise<PermissionPolicyMetadata> {
@@ -609,4 +629,8 @@ export class EnforcerDelegate {
609629
async getImplicitPermissionsForUser(user: string): Promise<string[][]> {
610630
return this.enforcer.getImplicitPermissionsForUser(user);
611631
}
632+
633+
async getAllRoles(): Promise<string[]> {
634+
return this.enforcer.getAllRoles();
635+
}
612636
}

0 commit comments

Comments
 (0)