diff --git a/CHANGELOG.md b/CHANGELOG.md index 9299a975..4c1b7f36 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [1.0.0-beta.5](https://github.com/casbin/casbin.js/compare/v1.0.0-beta.4...v1.0.0-beta.5) (2021-09-29) + + +### Features + +* RBAC with Domains API ([5e49b41](https://github.com/casbin/casbin.js/commit/5e49b41a2988a20e324715377e0c8302c9e9c3aa)) + # [1.0.0-beta.4](https://github.com/casbin/casbin.js/compare/v1.0.0-beta.3...v1.0.0-beta.4) (2021-08-31) diff --git a/package.json b/package.json index 859ba44e..62258ab4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "casbin.js", - "version": "1.0.0-beta.4", + "version": "1.0.0-beta.5", "description": "An authorization library that supports access control models like ACL, RBAC, ABAC in Typescript", "main": "lib/cjs/index.js", "typings": "lib/cjs/index.d.ts", diff --git a/src/enforcer.ts b/src/enforcer.ts index 734ef66f..65750578 100644 --- a/src/enforcer.ts +++ b/src/enforcer.ts @@ -144,6 +144,19 @@ export class Enforcer extends ManagementEnforcer { } } + /** + * addRoleForUserInDomain adds a role for a user. + * Returns false if the user already has the role (aka not affected). + * + * @param user the user. + * @param role the role. + * @param domain the domain. + * @return succeeds or not. + */ + public async addRoleForUserInDomain(user: string, role: string, domain: string): Promise { + return this.addGroupingPolicy(user, role, domain); + } + /** * deleteRoleForUser deletes a role for a user. * Returns false if the user does not have the role (aka not affected). @@ -160,6 +173,18 @@ export class Enforcer extends ManagementEnforcer { return this.removeGroupingPolicy(user, role, domain); } } + /** + * deleteRoleForUserInDomain deletes a role for a user. + * Returns false if the user does not have the role (aka not affected). + * + * @param user the user. + * @param role the role. + * @param domain the domain. + * @return succeeds or not. + */ + public async deleteRoleForUserInDomain(user: string, role: string, domain?: string): Promise { + return this.deleteRoleForUser(user, role, domain); + } /** * deleteRolesForUser deletes all roles for a user. @@ -177,6 +202,18 @@ export class Enforcer extends ManagementEnforcer { } } + /** + * deleteRolesForUserInDomain deletes all roles for a user. + * Returns false if the user does not have any roles (aka not affected). + * + * @param user the user. + * @param domain the domain. + * @return succeeds or not. + */ + public async deleteRolesForUserInDomain(user: string, domain?: string): Promise { + return this.deleteRolesForUser(user, domain); + } + /** * deleteUser deletes a user. * Returns false if the user does not exist (aka not affected). @@ -313,6 +350,7 @@ export class Enforcer extends ManagementEnforcer { * getPermissionsForUser("alice") can only get: [["alice", "data2", "read"]]. * But getImplicitPermissionsForUser("alice") will get: [["admin", "data1", "read"], ["alice", "data2", "read"]]. */ + public async getImplicitPermissionsForUser(user: string, ...domain: string[]): Promise { const roles = await this.getImplicitRolesForUser(user, ...domain); roles.unshift(user); @@ -332,6 +370,16 @@ export class Enforcer extends ManagementEnforcer { return res; } + /** + * getPermissionsForUserInDomain gets implicit permissions for a user or role. + * Compared to getPermissionsForUser(), this function retrieves permissions for inherited roles. + */ + + public async getPermissionsForUserInDomain(user: string, domain: string): Promise { + const res = await this.getImplicitPermissionsForUser(user, domain); + return res; + } + /** * getImplicitUsersForPermission gets implicit users for a permission. * For example: diff --git a/test/rbacAPI.test.ts b/test/rbacAPI.test.ts index b15a205e..4a4c6b4a 100644 --- a/test/rbacAPI.test.ts +++ b/test/rbacAPI.test.ts @@ -174,3 +174,24 @@ test('test getImplicitUsersForPermission', async () => { expect(await e.getImplicitUsersForPermission('data1', 'read')).toEqual(['bob', 'alice']); }); + +test('test getPermissionsForUserInDomain', async () => { + const e = await getEnforcerWithPath('examples/rbac_with_domains_model.conf', 'examples/rbac_with_domains_policy.csv'); + expect(await e.getPermissionsForUserInDomain('alice', 'domain1')).toEqual([ + ['admin', 'domain1', 'data1', 'read'], + ['admin', 'domain1', 'data1', 'write'], + ]); + expect(await e.getPermissionsForUserInDomain('bob', 'domain2')).toEqual([ + ['admin', 'domain2', 'data2', 'read'], + ['admin', 'domain2', 'data2', 'write'], + ]); +}); +test('test add/deleteRoleForUserInDomain', async () => { + const e = await getEnforcerWithPath('examples/rbac_with_domains_model.conf', 'examples/rbac_with_hierarchy_with_domains_policy.csv'); + expect(await e.addRoleForUserInDomain('bob', 'role:global_admin', 'domain1')).toEqual(true); + expect(await e.hasRoleForUser('bob', 'role:global_admin', 'domain1')).toEqual(true); + expect(await e.getUsersForRole('role:global_admin', 'domain1')).toEqual(['alice', 'bob']); + expect(await e.deleteRoleForUserInDomain('bob', 'role:global_admin', 'domain1')).toEqual(true); + expect(await e.hasRoleForUser('bob', 'role:global_admin', 'domain1')).toEqual(false); + expect(await e.getUsersForRole('role:global_admin', 'domain1')).toEqual(['alice']); +});