Basic Usage

Checking Access

Check roles and permissions on your models.
Prefer checking permissions over roles. Roles are just groups of permissions.

Permissions

await user.can('edit articles') // boolean
await user.cannot('edit articles') // boolean
await user.hasPermissionTo('edit articles') // boolean
await user.checkPermissionTo('edit articles') // true or throws

await user.hasAnyPermission('edit articles', 'delete articles')
await user.hasAllPermissions('edit articles', 'delete articles')

can() and hasPermissionTo() check direct permissions and permissions inherited from roles. To be specific:

await user.hasDirectPermission('edit articles')
await user.hasPermissionViaRole('edit articles')

await user.getDirectPermissions() // permission models
await user.getPermissionsViaRoles() // permission models
await user.getAllPermissions() // direct + via roles
await user.getPermissionNames() // string[] (direct)

Roles

await user.hasRole('writer')
await user.hasRole(['writer', 'admin']) // any of them
await user.hasAnyRole('writer', 'admin')
await user.hasAllRoles('writer', 'admin')
await user.hasExactRoles('writer', 'admin') // exactly these roles
await user.getRoleNames() // string[]

Role permissions

await role.hasPermissionTo('edit articles')
await role.hasAnyPermission('edit articles', 'delete articles')
await role.getPermissionNames()

Edge

Edge tags are registered automatically when Edge is available. They use auth.user from the template state:

@can('edit articles')
  <a href="/articles/1/edit">Edit</a>
@end

@cannot('edit articles')
  <p>Read only</p>
@end

@role('admin')
  <a href="/admin">Admin panel</a>
@end

@hasrole('admin')
  ...
@end

Error

Middlewares and checkPermissionTo() throw E_PERMISSION_UNAUTHORIZED_ACCESS with status 403. When requested as JSON it renders { errors: [{ code, status, message }] }; otherwise it sends the message as plain text. You can handle it in your exception handler like any other error:

import { E_PERMISSION_UNAUTHORIZED_ACCESS } from '@eienjs/adonisjs-permission'

if (error instanceof E_PERMISSION_UNAUTHORIZED_ACCESS) {
  // custom handling
}