Skip to content
markdown
---
name: packages-larajs-permission
description: Use when the user asks about the LaraJS Permission package, role-based access control (RBAC), installing larajs/permission, adding HasRoles trait to User model, defining Super-Admin with Gate::before in AuthServiceProvider, setting up role/permission seeders (SetupUserRolePermissionSeeder), RoleEnum, PermissionEnum, syncing roles and permissions (syncRoles, givePermissionTo), or integrating the Role Permission UI in the Vue.js CMS frontend.
---

# LaraJS Permission

## Introduction

LaraJS integrates [Laravel Permission](https://spatie.be/docs/laravel-permission/v6/introduction) to handle role-based access control (RBAC) in your application. This package simplifies the management of user permissions, roles, and access to various resources.

## Getting Started

### Installation

By default, the `/api/v1/me` endpoint returns users with the `ADMIN` role. If you wish to implement more granular role and permission control, you can modify the response in `AuthResource.php`.

**Backend**

1. Install the **larajs-permission** backend package:

```bash
composer require larajs/permission:dev-main
```

2. Add `HasRoles` trait to the `User.php` model:

```php
use Spatie\Permission\Traits\HasRoles;

class User extends Authenticatable
{
  use HasRoles;
  // ...
}
```

3. Define a Super-Admin in the `AuthServiceProvider.php` file:

```php
<?php

namespace App\Providers;

use LaraJS\Permission\Enums\RoleEnum;

class AuthServiceProvider extends ServiceProvider
{
  public function boot(): void {
    Gate::before(function ($user, $ability) {
        return $user->hasRole(RoleEnum::ADMIN->name) ? true : null;
    });
  }
}
```

4. Set up a user, role, and permission seeder in `SetupUserRolePermissionSeeder.php`:

```php
<?php

namespace Database\Seeders;

use App\Enums\AuthEnum;
use App\Models\User;
use Illuminate\Database\Seeder;
use LaraJS\Permission\Enums\PermissionEnum;
use LaraJS\Permission\Enums\RoleEnum;
use LaraJS\Permission\Models\Permission;
use LaraJS\Permission\Models\Role;

class SetupUserRolePermissionSeeder extends Seeder
{
  public function run()
  {
      foreach (array_map(fn (RoleEnum $role) => $role->name, RoleEnum::cases()) as $role) {
          Role::findOrCreate($role);
      }

      foreach (
          array_map(fn (PermissionEnum $permission) => $permission->name, PermissionEnum::cases()) as $permission
      ) {
          Permission::findOrCreate($permission);
      }

      $admin = User::create([
        'name' => 'Admin',
        'email' => AuthEnum::USERNAME->value,
        'password' => AuthEnum::PASSWORD->value,
      ]);
      $manager = User::create([
          'name' => 'Manager',
          'email' => 'manager@larajs.com',
          'password' => AuthEnum::PASSWORD->value,
      ]);
      // Find roles
      $adminRole = Role::findByName(RoleEnum::ADMIN->name);
      $managerRole = Role::findByName(RoleEnum::MANAGER->name);
      // Sync Roles
      $admin->syncRoles($adminRole);
      $manager->syncRoles($managerRole);
      // Sync permissions
      $managerRole->givePermissionTo([
          array_map(function (PermissionEnum $permission) {
              return $permission->name;
          }, PermissionEnum::cases()),
      ]);
  }
}
```

**Frontend (Optional)**

To include the Role Permission UI in your CMS, import the component into the administrator module at `apps/cms/src/router/modules/administrator.ts`:

```ts
const administrator: RouterMapping = {
  path: "/administrators",
  name: "administrators",
  // ...
  children: [
    {
      path: "roles",
      name: "Role",
      component: () =>
        import(
          "@larajs/permission/src/views/role-permission/RolePermission.vue"
        ),
      meta: {
        title: "role_permission",
        icon: "role",
        permissions: [PermissionType.MANAGE],
      },
    },
    // ...
  ],
};
```