Skip to content

Creating Roles and ACL at run time #2055

@dschrimpsher

Description

@dschrimpsher

In the app we are developing, we allow admins to create Roles that have different, granular permissions (READ on this endpoint, WRITE on that endpoint, etc...). What we are trying to do is create Roles, Users and ACLs at run time through the REST API.

Users works fine. We extend User to user and POST to /api/users

{
  "profile": {
    "firstname": "Bob",
    "lastname": "Bobby"
  },
  "primary": false,
  "username": "bbobb",
  "email": "b.bob@aol.com",
  "status": "isActive",
  "password": "#$@#$@#%%"
}

Roles works fine. We extend Role to role and POST to /api/roles

{
  "name": "teammember",
  "description": "Organization Team Member"
}

RoleMapping works fine. We POST to /api/roles/{id}/principles

 {
                "principalType": "USER",
                "principalId": teamMemberUserId
 }

As long as we use the predefined ACLs in the .json file it works without a hitch.
However, teammember is not allowed to GET /api/mymodel

But we want to add a new ACL for the new Role so we POST /api/acls

{
    "model": "mymodel",
    "property": "find",
    "accessType": "EXECUTE",
    "permission": "ALLOW",
    "principalType": "ROLE",
    "principalId": "teammember",
  }

and

  {
    "model": "mymodel",
    "property": "find",
    "accessType": "READ",
    "permission": "ALLOW",
    "principalType": "ROLE",
    "principalId": "teammember",
  }

We login with the user (Bob) and get the access token and we get a 401 for GET /api/mymodel

We have tried

  1. extending ACL to acl and POST (no effect on permissions)
  2. exposing ACL directly and POST (no effect on permissions)
  3. Pushing the ACL to the Model.settings.acls in a boot script

None of it works. Only adding to the mymodel.json file and restart node works.
I rand DEBUG loopback:security:* it doesn't seem to even see the new ACLs.

What are we missing? Is the supposed to work? Are we excepting more out of loopback that it provides?

Thanks

 loopback:security:role isInRole(): $everyone +49s
  loopback:security:access-context ---AccessContext--- +0ms
  loopback:security:access-context principals: +0ms
  loopback:security:access-context principal: {"type":"USER","id":"56ba2464d7cbe21b2e51383b"} +0ms
  loopback:security:access-context modelName mymodel +0ms
  loopback:security:access-context modelId undefined +0ms
  loopback:security:access-context property find +0ms
  loopback:security:access-context method find +0ms
  loopback:security:access-context accessType READ +0ms
  loopback:security:access-context accessToken: +0ms
  loopback:security:access-context   id "TGVnVoQaCvwEcDRwdYSEDnEDQI1bViJIlw7pwsQ4LFIZ8dvDiF4pb3RRrEZWMMG7" +0ms
  loopback:security:access-context   ttl 1209600 +0ms
  loopback:security:access-context getUserId() 56ba2464d7cbe21b2e51383b +0ms
  loopback:security:access-context isAuthenticated() true +0ms
  loopback:security:role Custom resolver found for role $everyone +0ms
  loopback:security:role isInRole(): admin +0ms
  loopback:security:access-context ---AccessContext--- +0ms
  loopback:security:access-context principals: +0ms
  loopback:security:access-context principal: {"type":"USER","id":"56ba2464d7cbe21b2e51383b"} +0ms
  loopback:security:access-context modelName mymodel +0ms
  loopback:security:access-context modelId undefined +0ms
  loopback:security:access-context property find +0ms
  loopback:security:access-context method find +0ms
  loopback:security:access-context accessType READ +0ms
  loopback:security:access-context accessToken: +0ms
  loopback:security:access-context   id "TGVnVoQaCvwEcDRwdYSEDnEDQI1bViJIlw7pwsQ4LFIZ8dvDiF4pb3RRrEZWMMG7" +0ms
  loopback:security:access-context   ttl 1209600 +0ms
  loopback:security:access-context getUserId() 56ba2464d7cbe21b2e51383b +0ms
  loopback:security:access-context isAuthenticated() true +0ms
  loopback:security:role isInRole(): admin +1ms
  loopback:security:access-context ---AccessContext--- +0ms
  loopback:security:access-context principals: +0ms
  loopback:security:access-context principal: {"type":"USER","id":"56ba2464d7cbe21b2e51383b"} +0ms
  loopback:security:access-context modelName mymodel +0ms
  loopback:security:access-context modelId undefined +0ms
  loopback:security:access-context property find +0ms
  loopback:security:access-context method find +0ms
  loopback:security:access-context accessType READ +0ms
  loopback:security:access-context accessToken: +0ms
  loopback:security:access-context   id "TGVnVoQaCvwEcDRwdYSEDnEDQI1bViJIlw7pwsQ4LFIZ8dvDiF4pb3RRrEZWMMG7" +0ms
  loopback:security:access-context   ttl 1209600 +0ms
  loopback:security:access-context getUserId() 56ba2464d7cbe21b2e51383b +0ms
  loopback:security:access-context isAuthenticated() true +0ms
  loopback:security:role isInRole(): teammember +0ms
  loopback:security:access-context ---AccessContext--- +0ms
  loopback:security:access-context principals: +0ms
  loopback:security:access-context principal: {"type":"USER","id":"56ba2464d7cbe21b2e51383b"} +0ms
  loopback:security:access-context modelName mymodel +0ms
  loopback:security:access-context modelId undefined +0ms
  loopback:security:access-context property find +0ms
  loopback:security:access-context method find +0ms
  loopback:security:access-context accessType READ +0ms
  loopback:security:access-context accessToken: +0ms
  loopback:security:access-context   id "TGVnVoQaCvwEcDRwdYSEDnEDQI1bViJIlw7pwsQ4LFIZ8dvDiF4pb3RRrEZWMMG7" +0ms
  loopback:security:access-context   ttl 1209600 +1ms
  loopback:security:access-context getUserId() 56ba2464d7cbe21b2e51383b +0ms
  loopback:security:access-context isAuthenticated() true +0ms
  loopback:security:role isInRole(): teammember +0ms
  loopback:security:access-context ---AccessContext--- +0ms
  loopback:security:access-context principals: +0ms
  loopback:security:access-context principal: {"type":"USER","id":"56ba2464d7cbe21b2e51383b"} +0ms
  loopback:security:access-context modelName mymodel +0ms
  loopback:security:access-context modelId undefined +0ms
  loopback:security:access-context property find +0ms
  loopback:security:access-context method find +0ms
  loopback:security:access-context accessType READ +0ms
  loopback:security:access-context accessToken: +0ms
  loopback:security:access-context   id "TGVnVoQaCvwEcDRwdYSEDnEDQI1bViJIlw7pwsQ4LFIZ8dvDiF4pb3RRrEZWMMG7" +0ms
  loopback:security:access-context   ttl 1209600 +0ms
  loopback:security:access-context getUserId() 56ba2464d7cbe21b2e51383b +0ms
  loopback:security:access-context isAuthenticated() true +0ms
  loopback:security:role Role found: {"id":"56b8db8270b45727672bfd7e","name":"admin","description":"System Administrator","created":"2016-02-08T18:16:34.660Z","modified":"2016-02-08T18:16:34.660Z"} +1ms
  loopback:security:role Role found: {"id":"56b8db8270b45727672bfd7e","name":"admin","description":"System Administrator","created":"2016-02-08T18:16:34.660Z","modified":"2016-02-08T18:16:34.660Z"} +2ms
  loopback:security:role Role found: {"id":"56b8db8270b45727672bfd7f","name":"teammember","description":"Team Member","created":"2016-02-08T18:16:34.672Z","modified":"2016-02-08T18:16:34.672Z"} +1ms
  loopback:security:role Role found: {"id":"56b8db8270b45727672bfd7f","name":"teammember","description":"Team Member","created":"2016-02-08T18:16:34.672Z","modified":"2016-02-08T18:16:34.672Z"} +2ms
  loopback:security:role Role mapping found: null +1ms
  loopback:security:role isInRole() returns: false +0ms
  loopback:security:role Role mapping found: null +0ms
  loopback:security:role isInRole() returns: false +0ms
  loopback:security:role Role mapping found: null +0ms
  loopback:security:role isInRole() returns: false +0ms
  loopback:security:role Role mapping found: null +0ms
  loopback:security:role isInRole() returns: false +0ms
  loopback:security:acl The following ACLs were searched:  +1ms
  loopback:security:acl ---ACL--- +0ms
  loopback:security:acl model mymodel +0ms
  loopback:security:acl property * +0ms
  loopback:security:acl principalType ROLE +0ms
  loopback:security:acl principalId $everyone +0ms
  loopback:security:acl accessType * +0ms
  loopback:security:acl permission DENY +0ms
  loopback:security:acl with score: +0ms 7495
  loopback:security:acl ---Resolved--- +0ms
  loopback:security:access-context ---AccessRequest--- +0ms
  loopback:security:access-context  model mymodel +0ms
  loopback:security:access-context  property find +0ms
  loopback:security:access-context  accessType READ +0ms
  loopback:security:access-context  permission DENY +0ms
  loopback:security:access-context  isWildcard() false +0ms
  loopback:security:access-context  isAllowed() false +0ms

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions