fix: empty resource acl error (#357)

This commit is contained in:
ChengLei Shao 2022-05-04 10:16:53 +08:00 committed by GitHub
parent 90a58cc3cf
commit 914600209a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 60 additions and 1 deletions

View File

@ -175,6 +175,8 @@ export class ACL extends EventEmitter {
action, action,
params: actionParams, params: actionParams,
}; };
} else {
return null;
} }
} }

View File

@ -72,6 +72,56 @@ describe('acl', () => {
}); });
}); });
it('should deny when resource action has no resource', async () => {
const role = await db.getRepository('roles').create({
values: {
name: 'admin',
title: 'Admin User',
allowConfigure: true,
strategy: {
actions: ['update:own', 'destroy:own', 'create', 'view'],
},
},
});
changeMockRole('admin');
// create c1 collection
await db.getRepository('collections').create({
values: {
name: 'c1',
title: 'table1',
},
});
// create c2 collection
await db.getRepository('collections').create({
values: {
name: 'c2',
title: 'table2',
},
});
await app
.agent()
.resource('roles.resources', 'admin')
.create({
values: {
name: 'c1',
usingActionsConfig: true,
actions: [],
},
});
expect(
acl.can({
role: 'admin',
resource: 'c1',
action: 'list',
}),
).toBeNull();
});
it('should works with resources actions', async () => { it('should works with resources actions', async () => {
const role = await db.getRepository('roles').create({ const role = await db.getRepository('roles').create({
values: { values: {

View File

@ -1,5 +1,5 @@
import { Database, Model } from '@nocobase/database'; import { Database, Model } from '@nocobase/database';
import { ACL, ACLRole } from '@nocobase/acl'; import { ACL, ACLResource, ACLRole } from '@nocobase/acl';
import { RoleResourceActionModel } from './RoleResourceActionModel'; import { RoleResourceActionModel } from './RoleResourceActionModel';
import { AssociationFieldsActions, GrantHelper } from '../server'; import { AssociationFieldsActions, GrantHelper } from '../server';
@ -43,6 +43,13 @@ export class RoleResourceModel extends Model {
return; return;
} }
const resource = new ACLResource({
role,
name: resourceName,
});
role.resources.set(resourceName, resource);
// @ts-ignore // @ts-ignore
const actions: RoleResourceActionModel[] = await this.getActions({ const actions: RoleResourceActionModel[] = await this.getActions({
transaction: options.transaction, transaction: options.transaction,