{"id":13787122,"url":"https://github.com/enniel/adonis-acl","last_synced_at":"2025-04-04T08:04:40.893Z","repository":{"id":57173509,"uuid":"92686204","full_name":"enniel/adonis-acl","owner":"enniel","description":"demo app: https://github.com/enniel/adonis-acl-blog-demo","archived":false,"fork":false,"pushed_at":"2021-08-05T12:04:50.000Z","size":59,"stargazers_count":204,"open_issues_count":21,"forks_count":48,"subscribers_count":8,"default_branch":"master","last_synced_at":"2025-03-28T07:02:37.168Z","etag":null,"topics":["acl","adonis","adonis-framework","adonisjs","permissions","roles"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/enniel.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2017-05-28T20:46:16.000Z","updated_at":"2025-01-06T10:40:55.000Z","dependencies_parsed_at":"2022-08-24T13:31:02.252Z","dependency_job_id":null,"html_url":"https://github.com/enniel/adonis-acl","commit_stats":null,"previous_names":[],"tags_count":10,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/enniel%2Fadonis-acl","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/enniel%2Fadonis-acl/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/enniel%2Fadonis-acl/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/enniel%2Fadonis-acl/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/enniel","download_url":"https://codeload.github.com/enniel/adonis-acl/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247137315,"owners_count":20889850,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["acl","adonis","adonis-framework","adonisjs","permissions","roles"],"created_at":"2024-08-03T20:00:29.115Z","updated_at":"2025-04-04T08:04:40.875Z","avatar_url":"https://github.com/enniel.png","language":"JavaScript","funding_links":[],"categories":["Authentication \u0026 Authorization"],"sub_categories":[],"readme":"## !!! Maintainer Needed !!!\n\nI currently don't have the resources to maintain this project. If someone is willing to put in the time to do it, I'm willing to assign the necessary privileges to that person. If you're willing to do this, reply on [issue](https://github.com/enniel/adonis-acl/issues/49) or send me [email](mailto:razumov.evgeni@gmail.com).\n\n\n\n# Adonis ACL\n\nAdonis ACL adds role based permissions to built in [Auth System](https://github.com/adonisjs/adonis-auth) of [Adonis Framework](https://github.com/adonisjs/adonis-framework).\n\n[![NPM Version](https://img.shields.io/npm/v/adonis-acl.svg?style=flat-square)](https://npmjs.org/package/adonis-acl)\n[![GitHub license](https://img.shields.io/github/license/enniel/adonis-acl.svg)](https://github.com/enniel/adonis-acl/blob/master/LICENSE.md)\n[![Build Status](https://travis-ci.org/enniel/adonis-acl.svg?branch=master)](https://travis-ci.org/enniel/adonis-acl)\n[![Coverage Status](https://coveralls.io/repos/github/enniel/adonis-acl/badge.svg?branch=master)](https://coveralls.io/github/enniel/adonis-acl?branch=master)\n\n## Installation\n\n1. Add package:\n\n```bash\n$ npm i adonis-acl --save\n```\nor\n\n```bash\n$ yarn add adonis-acl\n```\n\n2. Register ACL providers inside the your start/app.js file.\n\n```js\nconst providers = [\n  ...\n  'adonis-acl/providers/AclProvider',\n  ...\n]\n\nconst aceProviders = [\n  ...\n  'adonis-acl/providers/CommandsProvider',\n  ...\n]\n```\n\n3. Setting up aliases inside `start/app.js` file.\n\n```js\nconst aliases = {\n  ...\n  Role: 'Adonis/Acl/Role',\n  Permission: 'Adonis/Acl/Permission',\n  ...\n}\n```\n\n4. Setting up traits to `User` model.\n\n```js\nclass User extends Model {\n  ...\n  static get traits () {\n    return [\n      '@provider:Adonis/Acl/HasRole',\n      '@provider:Adonis/Acl/HasPermission'\n    ]\n  }\n  ...\n}\n```\n\n5. Setting up middlewares inside `start/kernel.js` file.\n\n```js\nconst namedMiddleware = {\n  ...\n  is: 'Adonis/Acl/Is',\n  can: 'Adonis/Acl/Can',\n  ...\n}\n```\n\nFor using in views\n\n```js\nconst globalMiddleware = [\n  ...\n  'Adonis/Acl/Init'\n  ...\n]\n```\n\n6. Publish the package migrations to your application and run these with `./ace migrations:run`.\n\n```bash\n$ ./ace acl:setup\n```\n\n## Working With Roles\n\n### Create Role\n\nLets create your first roles.\n\n```js\nconst roleAdmin = new Role()\nroleAdmin.name = 'Administrator'\nroleAdmin.slug = 'administrator'\nroleAdmin.description = 'manage administration privileges'\nawait roleAdmin.save()\n\nconst roleModerator = new Role()\nroleModerator.name = 'Moderator'\nroleModerator.slug = 'moderator'\nroleModerator.description = 'manage moderator privileges'\nawait roleModerator.save()\n```\n\nBefore, You should do first, use the `HasRole` trait in Your `User` Model.\n\n```js\nclass User extends Model {\n  ...\n  static get traits () {\n    return [\n      '@provider:Adonis/Acl/HasRole'\n    ]\n  }\n  ...\n}\n```\n\n### Attach Role(s) To User\n```js\nconst user = await User.find(1)\nawait user.roles().attach([roleAdmin.id, roleModerator.id])\n```\n\n### Detach Role(s) From User\n\n```js\nconst user = await User.find(1)\nawait user.roles().detach([roleAdmin.id])\n```\n\n### Get User Roles\n\nGet roles assigned to a user.\n\n```js\nconst user = await User.first()\nconst roles = await user.getRoles() // ['administrator', 'moderator']\n```\n\n## Working With Permissions\n\n### Create Role Permissions\n\n```js\nconst createUsersPermission = new Permission()\ncreateUsersPermission.slug = 'create_users'\ncreateUsersPermission.name = 'Create Users'\ncreateUsersPermission.description = 'create users permission'\nawait createUsersPermission.save()\n\nconst updateUsersPermission = new Permission()\nupdateUsersPermission.slug = 'update_users'\nupdateUsersPermission.name = 'Update Users'\nupdateUsersPermission.description = 'update users permission'\nawait updateUsersPermission.save()\n\nconst deleteUsersPermission = new Permission()\ndeleteUsersPermission.slug = 'delete_users'\ndeleteUsersPermission.name = 'Delete Users'\ndeleteUsersPermission.description = 'delete users permission'\nawait deleteUsersPermission.save()\n\nconst readUsersPermission = new Permission()\nreadUsersPermission.slug = 'read_users'\nreadUsersPermission.name = 'Read Users'\nreadUsersPermission.description = 'read users permission'\nawait readUsersPermission.save()\n```\n\nBefore, You should do first, use the `HasPermission` trait in Your `User` Model.\n\n```js\nclass User extends Model {\n  ...\n  static get traits () {\n    return [\n      '@provider:Adonis/Acl/HasPermission'\n    ]\n  }\n  ...\n}\n```\n\n### Attach Permissions to Role\n\n```js\nconst roleAdmin = await Role.find(1)\nawait roleAdmin.permissions().attach([\n  createUsersPermission.id,\n  updateUsersPermission.id,\n  deleteUsersPermission.is,\n  readUsersPermission.id\n])\n```\n\n### Detach Permissions from Role\n\n```js\nconst roleAdmin = await Role.find(1)\nawait roleAdmin.permissions().detach([\n  createUsersPermission.id,\n  updateUsersPermission.id,\n  deleteUsersPermission.is,\n  readUsersPermission.id\n])\n```\n\n### Get User Permissions\n\nGet permissions assigned to a role.\n\n```js\nconst roleAdmin = await Role.find(1)\n// ['create_users', 'update_users', 'delete_users', 'read_users']\nawait roleAdmin.getPermissions()\n```\n\nor\n\n```js\nconst roleAdmin = await Role.find(1)\n// collection of permissions\nawait roleAdmin.permissions().fetch()\n```\n\n## Working With Permissions\n\n### Create User Permissions\n\n```js\nconst createUsersPermission = new Permission()\ncreateUsersPermission.slug = 'create_users'\ncreateUsersPermission.name = 'Create Users'\ncreateUsersPermission.description = 'create users permission'\nawait createUsersPermission.save()\n\nconst updateUsersPermission = new Permission()\nupdateUsersPermission.slug = 'update_users'\nupdateUsersPermission.name = 'Update Users'\nupdateUsersPermission.description = 'update users permission'\nawait updateUsersPermission.save()\n\nconst deleteUsersPermission = new Permission()\ndeleteUsersPermission.slug = 'delete_users'\ndeleteUsersPermission.name = 'Delete Users'\ndeleteUsersPermission.description = 'delete users permission'\nawait deleteUsersPermission.save()\n\nconst readUsersPermission = new Permission()\nreadUsersPermission.slug = 'read_users'\nreadUsersPermission.name = 'Read Users'\nreadUsersPermission.description = 'read users permission'\nawait readUsersPermission.save()\n```\n\nBefore, You should do first, use the `HasPermission` trait in Your `User` Model.\n\n```js\nclass User extends Model {\n  ...\n  static get traits () {\n    return [\n      'Adonis/Acl/HasPermission'\n    ]\n  }\n  ...\n}\n```\n\n### Attach Permissions to User\n\n```js\nconst user = await User.find(1)\nawait user.permissions().attach([\n  createUsersPermission.id,\n  updateUsersPermission.id,\n  deleteUsersPermission.is,\n  readUsersPermission.id\n])\n```\n\n### Detach Permissions from User\n\n```js\nconst user = await User.find(1)\nawait user.permissions().detach([\n  createUsersPermission.id,\n  updateUsersPermission.id,\n  deleteUsersPermission.is,\n  readUsersPermission.id\n])\n```\n\n### Get User Permissions\n\nGet permissions assigned to a role.\n\n```js\nconst user = await User.find(1)\n// ['create_users', 'update_users', 'delete_users', 'read_users']\nawait user.getPermissions()\n```\n\nor\n\n```js\nconst user = await User.find(1)\n// collection of permissions\nawait user.permissions().fetch()\n```\n\n## Protect Routes\n\nSyntax:\n\n`and (\u0026\u0026)` - administrator \u0026\u0026 moderator\n\n`or (||)` - administrator || moderator\n\n`not (!)` - administrator \u0026\u0026 !moderator\n\n```js\n// check roles\nRoute\n  .get('/users')\n  .middleware(['auth:jwt', 'is:(administrator || moderator) \u0026\u0026 !customer'])\n\n// check permissions\nRoute\n  .get('/posts')\n  .middleware(['auth:jwt', 'can:read_posts'])\n\n// scopes (using permissions table for scopes)\nRoute\n  .get('/posts')\n  .middleware(['auth:jwt', 'scope:posts.*'])\n```\n\n## Using in Views\n\n```\n@loggedIn\n  @is('administrator')\n    \u003ch2\u003eProtected partial\u003c/h2\u003e\n  @endis\n@endloggedIn\n```\n\nor\n\n```\n@loggedIn\n  @can('create_posts \u0026\u0026 delete_posts')\n    \u003ch2\u003eProtected partial\u003c/h2\u003e\n  @endcan\n@endloggedIn\n```\n\nor\n\n```\n@loggedIn\n  @scope('posts.create', 'posts.delete')\n    \u003ch2\u003eProtected partial\u003c/h2\u003e\n  @endscope\n@endloggedIn\n```\n\n## Credits\n\n- [Evgeni Razumov](https://github.com/enniel)\n\n## Support\n\nHaving trouble? [Open an issue](https://github.com/enniel/adonis-acl/issues/new)!\n\n## License\n\nThe MIT License (MIT). Please see [License File](LICENSE.md) for more information.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fenniel%2Fadonis-acl","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fenniel%2Fadonis-acl","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fenniel%2Fadonis-acl/lists"}