diff --git a/packages/core/acl/src/acl.ts b/packages/core/acl/src/acl.ts index 9a38d42306..f3a0157148 100644 --- a/packages/core/acl/src/acl.ts +++ b/packages/core/acl/src/acl.ts @@ -170,7 +170,7 @@ export class ACL extends EventEmitter { } getRoles(names: string[]): ACLRole[] { - return names.map((name) => this.getRole(name)); + return names.map((name) => this.getRole(name)).filter((x) => Boolean(x)); } removeRole(name: string) { diff --git a/packages/plugins/@nocobase/plugin-acl/src/server/actions/role-check.ts b/packages/plugins/@nocobase/plugin-acl/src/server/actions/role-check.ts index 04da2dfa26..84020db9e6 100644 --- a/packages/plugins/@nocobase/plugin-acl/src/server/actions/role-check.ts +++ b/packages/plugins/@nocobase/plugin-acl/src/server/actions/role-check.ts @@ -39,7 +39,7 @@ export async function checkAction(ctx, next) { let roles = ctx.app.acl.getRoles(currentRoles); if (!roles.length) { - await ctx.app.emitAsync('acl:writeRoleToACL', roleInstances); + await Promise.all(roleInstances.map((x) => ctx.app.emitAsync('acl:writeRoleToACL', x))); roles = ctx.app.acl.getRoles(currentRoles); } const availableActions = ctx.app.acl.getAvailableActions(); diff --git a/packages/plugins/@nocobase/plugin-acl/src/server/utils/role.ts b/packages/plugins/@nocobase/plugin-acl/src/server/utils/role.ts index 859d3a8881..4dafa9cbe7 100644 --- a/packages/plugins/@nocobase/plugin-acl/src/server/utils/role.ts +++ b/packages/plugins/@nocobase/plugin-acl/src/server/utils/role.ts @@ -12,9 +12,7 @@ import _ from 'lodash'; export function mergeRole(roles) { const result: Record = { roles: [], - strategy: { - actions: [], - }, + strategy: {}, actions: null, snippets: [], resources: null, @@ -35,6 +33,9 @@ function mergeRoleNames(sourceRoleNames, newRoleName) { } function mergeRoleStrategy(sourceStrategy, newStrategy) { + if (!newStrategy) { + return sourceStrategy; + } const actions = sourceStrategy.actions.concat(newStrategy.actions); return { ...sourceStrategy,