PHPackages                             cuongnx/laravel-mongodb-permission - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Authentication &amp; Authorization](/categories/authentication)
4. /
5. cuongnx/laravel-mongodb-permission

ActiveLibrary[Authentication &amp; Authorization](/categories/authentication)

cuongnx/laravel-mongodb-permission
==================================

A flexible and multi-guard Role &amp; Permission system for Laravel 11+ and 12+, using MongoDB and inspired by Spatie.

v2.0.2(2mo ago)5343MITPHPPHP ^8.1

Since Jul 12Pushed 2mo agoCompare

[ Source](https://github.com/xuancuong220691/laravel-mongodb-permission)[ Packagist](https://packagist.org/packages/cuongnx/laravel-mongodb-permission)[ RSS](/packages/cuongnx-laravel-mongodb-permission/feed)WikiDiscussions main Synced today

READMEChangelogDependencies (4)Versions (6)Used By (0)

laravel-mongodb-permission
==========================

[](#laravel-mongodb-permission)

[![Laravel](https://camo.githubusercontent.com/0b54a14e9c8ecbfbc8c6af588e474039bed98bdd341110cacf2833525faa87ef/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c61726176656c2d313125323025374325323031322d6f72616e6765)](https://laravel.com)[![MongoDB](https://camo.githubusercontent.com/61aeb73efaf7bb47d9bfdc04371e0e975742ab51c4643128d60ae3c3e09d1c7e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4d6f6e676f44422d352e342b2d677265656e)](https://www.mongodb.com)[![License](https://camo.githubusercontent.com/b8cadaa967891081f8f165695470689986c028821dd8a040132f6e661795dc0d/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d626c7565)](LICENSE)

Role &amp; Permission system cho Laravel + MongoDB. Hỗ trợ đa guard, không cần SQL, lưu trữ hoàn toàn trên MongoDB.

---

Yêu cầu
-------

[](#yêu-cầu)

Phiên bảnPHP`^8.1`Laravel`^11.0 || ^12.0`mongodb/laravel-mongodb`^5.4`---

Cài đặt
-------

[](#cài-đặt)

```
composer require cuongnx/laravel-mongodb-permission
```

Service provider được tự động đăng ký qua Laravel package discovery.

Publish config:

```
php artisan vendor:publish --tag=mongo-permission
```

---

Cấu hình
--------

[](#cấu-hình)

`config/mongo-permission.php` — khai báo các Model sử dụng `HasRoles` để thư viện tự động cleanup khi xóa role/permission:

```
return [
    'models' => [
        App\Models\Admin::class,
        App\Models\User::class,
    ],
];
```

---

Setup Model
-----------

[](#setup-model)

Gắn trait `HasRoles` vào model và khai báo `$guard_name`:

```
use CuongNX\LaravelMongoPermission\Traits\HasRoles;

class Admin extends Authenticatable
{
    use HasRoles;

    protected $guard_name = 'admin'; // phải khai báo đúng guard
}
```

> **Lưu ý:** `$guard_name` quyết định thư viện tìm role/permission theo guard nào. Nếu bỏ qua, mặc định dùng `config('auth.defaults.guard')`.

---

Cấu trúc dữ liệu MongoDB
------------------------

[](#cấu-trúc-dữ-liệu-mongodb)

```
Collection: roles
{ _id, name: "super-admin", guard_name: "admin", permissions: ["manage-users", "view-logs"] }

Collection: permissions
{ _id, name: "manage-users", guard_name: "admin" }

Collection: admins (hoặc bất kỳ model nào dùng HasRoles)
{ ..., role_ids: ["", ...], permission_ids: ["", ...] }

```

- Role lưu danh sách permission **theo tên** (string array) — không dùng ObjectId
- User lưu danh sách role/permission **theo ObjectId** (string)

---

HasRoles API
------------

[](#hasroles-api)

### Roles

[](#roles)

```
// Gán role (bỏ qua nếu đã có)
$admin->assignRole('moderator');

// Gỡ role
$admin->removeRole('moderator');
$admin->revokeRole('moderator');  // alias của removeRole()

// Thay toàn bộ roles (xóa cũ, set mới)
$admin->syncRoles(['super-admin', 'moderator']);

// Kiểm tra
$admin->hasRole('moderator');              // bool — có cache
$admin->hasAnyRole(['admin', 'editor']);   // bool — có ít nhất 1
$admin->hasAllRoles(['admin', 'editor']);  // bool — phải có đủ tất cả

// Lấy danh sách tên
$admin->getRoleNames(); // Illuminate\Support\Collection
```

### Direct Permissions

[](#direct-permissions)

```
// Cấp permission trực tiếp cho user
$admin->givePermissionTo('edit-users');

// Thu hồi từng permission
$admin->revokePermissionTo('edit-users');

// Thay toàn bộ direct permissions (xóa cũ, set mới)
$admin->syncPermissions(['edit-users', 'view-logs']);

// Kiểm tra (direct permission HOẶC qua role — có cache)
$admin->hasPermissionTo('edit-users');                    // bool
$admin->hasAnyPermission(['edit-users', 'delete-posts']); // bool — có ít nhất 1
$admin->hasAllPermissions(['edit-users', 'view-logs']);   // bool — phải có đủ tất cả

// Lấy toàn bộ tên permissions (direct + via roles, unique)
$admin->getAllPermissions(); // string[]
```

> **Cache:** Kết quả `hasRole` và `hasPermissionTo` được cache trong static array theo key `::` trong suốt vòng đời request. Cache tự xóa khi gọi bất kỳ method mutation nào.

---

Middleware
----------

[](#middleware)

Middleware `role` và `permission` được đăng ký tự động:

```
// Kiểm tra role — dùng OR với dấu |
Route::middleware('role:super-admin')->...
Route::middleware('role:super-admin|moderator')->...

// Kiểm tra permission
Route::middleware('permission:edit-users')->...
Route::middleware('permission:edit-users|delete-posts')->...

// Chỉ định guard tường minh
Route::middleware('role:super-admin,admin')->...
Route::middleware('permission:edit-users,admin')->...
```

---

Blade Directives
----------------

[](#blade-directives)

```
{{-- Kiểm tra role (dùng default guard) --}}
@role('super-admin')
    Chỉ super-admin thấy
@endrole

{{-- Kiểm tra role với guard cụ thể --}}
@role('super-admin', 'admin')
    ...
@endrole

{{-- Kiểm tra permission --}}
@permission('edit-users')
    ...
@endpermission

@permission('edit-users', 'admin')
    ...
@endpermission

{{-- Có ít nhất 1 role (dùng default guard) --}}
@anyrole('super-admin', 'moderator', 'editor')
    ...
@endanyrole

{{-- Có ít nhất 1 role với guard cụ thể --}}
@anyrolefor('admin', 'super-admin', 'moderator')
    ...
@endanyrolefor

{{-- Có ít nhất 1 permission (dùng default guard) --}}
@anypermission('edit-users', 'delete-posts', 'view-logs')
    ...
@endanypermission

{{-- Có ít nhất 1 permission với guard cụ thể --}}
@anypermissionfor('admin', 'edit-users', 'delete-posts')
    ...
@endanypermissionfor
```

> **Lưu ý `@anyrole` vs `@anyrolefor`:** `@anyrole('r1', 'r2')` — tất cả tham số đều là tên role, dùng default guard. `@anyrolefor('guard', 'r1', 'r2')` — tham số đầu là guard, phần còn lại là role names. Tương tự với `@anypermission`/`@anypermissionfor`.

---

Artisan Command
---------------

[](#artisan-command)

```
php artisan mp:manage [options] [--guard=web]
```

### Roles

[](#roles-1)

```
# Tạo roles (nhiều role phân cách bằng dấu phẩy)
php artisan mp:manage --create-role=super-admin,moderator --guard=admin

# Xóa roles
php artisan mp:manage --delete-role=moderator --guard=admin

# Liệt kê
php artisan mp:manage --list-roles --guard=admin

# Xem chi tiết 1 role
php artisan mp:manage --show-role=super-admin --guard=admin
```

### Permissions

[](#permissions)

```
# Tạo permissions
php artisan mp:manage --create-permission=manage-users,view-logs,edit-posts --guard=admin

# Xóa permissions
php artisan mp:manage --delete-permission=edit-posts --guard=admin

# Liệt kê
php artisan mp:manage --list-permissions --guard=admin
```

### Gán / Gỡ permissions của role

[](#gán--gỡ-permissions-của-role)

```
# Thêm permissions vào role — cú pháp: role:perm1,perm2
php artisan mp:manage --assign-permission=super-admin:manage-users,view-logs --guard=admin

# Gỡ bớt permissions khỏi role (không ảnh hưởng permissions còn lại)
php artisan mp:manage --revoke-permission=super-admin:view-logs --guard=admin
```

### Export / Import

[](#export--import)

```
# Xuất toàn bộ ra JSON (tự tạo thư mục nếu chưa có)
php artisan mp:manage --export=storage/permissions.json

# Xuất theo guard cụ thể
php artisan mp:manage --export=storage/admin-permissions.json --guard=admin

# Nhập từ JSON (tự validate permissions trước khi gán vào role)
php artisan mp:manage --import=storage/permissions.json --guard=admin
```

Định dạng file JSON:

```
{
    "permissions": [
        { "name": "manage-users", "guard_name": "admin" },
        { "name": "view-logs", "guard_name": "admin" }
    ],
    "roles": [
        { "name": "super-admin", "guard_name": "admin", "permissions": ["manage-users", "view-logs"] },
        { "name": "moderator", "guard_name": "admin", "permissions": ["view-logs"] }
    ]
}
```

### Sync permissions từ file

[](#sync-permissions-từ-file)

```
# Thay toàn bộ permissions của 1 role bằng nội dung từ file JSON
# Cú pháp: role:path/to/file.json
php artisan mp:manage --sync-role-permissions=super-admin:storage/super-admin.json --guard=admin
```

File JSON chỉ cần có key `permissions`:

```
{
    "permissions": ["manage-users", "view-logs", "edit-posts"]
}
```

### Reset

[](#reset)

```
# Xóa roles & permissions của guard hiện tại (fire model events → cascade cleanup)
php artisan mp:manage --reset --guard=admin

# Xóa toàn bộ mọi guard bằng truncate (nhanh, không fire events)
php artisan mp:manage --reset-all
```

---

PermissionService (Dependency Injection)
----------------------------------------

[](#permissionservice-dependency-injection)

Inject `PermissionServiceInterface` để dùng trong code:

```
use CuongNX\LaravelMongoPermission\Services\Contracts\PermissionServiceInterface;

class RoleController extends Controller
{
    public function __construct(private PermissionServiceInterface $permissions) {}

    public function store(Request $request)
    {
        $this->permissions->createRoles('admin,editor', 'web');
        $this->permissions->assignPermissions('admin', 'edit-posts,delete-posts', 'web');
    }
}
```

MethodTrả vềMô tả`createRoles(string $roles, string $guard)``array`Tạo roles, bỏ qua nếu đã tồn tại`deleteRoles(string $roles, string $guard)``array`Xóa roles (fire model events → cascade cleanup)`createPermissions(string $perms, string $guard)``array`Tạo permissions`deletePermissions(string $perms, string $guard)``array`Xóa permissions (cascade cleanup)`assignPermissions(string $role, string $perms, string $guard)``array`Gán permissions vào role`revokePermissions(string $role, string $perms, string $guard)``array`Gỡ bớt permissions khỏi role`listRoles(string $guard)``array`Danh sách roles`listPermissions(string $guard)``array`Danh sách permissions`showRole(string $name, string $guard)``array`Chi tiết 1 role`exportToFile(string $path, ?string $guard)``void`Xuất JSON`importFromFile(string $path, string $guard)``array`Nhập JSON`syncRolePermissions(string $role, string $jsonPath, string $guard)``array`Sync permissions từ file`reset(?string $guard)``void`Xóa theo guard (fire events) hoặc truncate toàn bộ nếu không truyền guardKết quả trả về `array` có các key: `created`, `skipped`, `deleted`, `synced`, `failed`.

---

Cascade Cleanup
---------------

[](#cascade-cleanup)

Khi **xóa Role**, thư viện tự động:

- Xóa `role_ids` tương ứng khỏi tất cả user documents trong `config('mongo-permission.models')`

Khi **xóa Permission**, thư viện tự động:

- Xóa permission name khỏi `permissions[]` của tất cả Role documents
- Xóa `permission_ids` tương ứng khỏi tất cả user documents

> `reset($guard)` xóa từng document và fire model events → cascade cleanup chạy bình thường. `reset()` không tham số dùng `truncate()` — nhanh hơn nhưng **không** fire events và xóa **toàn bộ mọi guard**.

---

Sử dụng với Filament
--------------------

[](#sử-dụng-với-filament)

Ví dụ kiểm tra quyền trong Filament Resource:

```
public static function canAccess(): bool
{
    $user = Filament::auth()->user();
    return $user?->isSuperAdmin() || $user?->hasPermissionTo('manage-admins');
}
```

Ví dụ gán role sau khi tạo user:

```
protected function afterCreate(): void
{
    if ($role = $this->data['role'] ?? null) {
        $this->record->assignRole($role);
    }
}
```

Ví dụ sync role khi edit user:

```
protected function afterSave(): void
{
    $this->record->role_ids = [];
    $this->record->save();

    if ($role = $this->data['role'] ?? null) {
        $this->record->assignRole($role);
    }
}
```

---

License
-------

[](#license)

MIT © [Cuong Nguyen](mailto:xuancuong220691@gmail.com)

###  Health Score

42

—

FairBetter than 88% of packages

Maintenance86

Actively maintained with recent releases

Popularity17

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity49

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~73 days

Total

5

Last Release

67d ago

Major Versions

v1.1.1 → v2.0.02025-07-12

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/12405391?v=4)[Xuân Cương](/maintainers/xuancuong220691)[@xuancuong220691](https://github.com/xuancuong220691)

---

Top Contributors

[![xuancuong220691](https://avatars.githubusercontent.com/u/12405391?v=4)](https://github.com/xuancuong220691 "xuancuong220691 (8 commits)")

### Embed Badge

![Health badge](/badges/cuongnx-laravel-mongodb-permission/health.svg)

```
[![Health](https://phpackages.com/badges/cuongnx-laravel-mongodb-permission/health.svg)](https://phpackages.com/packages/cuongnx-laravel-mongodb-permission)
```

###  Alternatives

[statamic-rad-pack/runway

Eloquently manage your database models in Statamic.

135224.7k7](/packages/statamic-rad-pack-runway)[jeremy379/laravel-openid-connect

OpenID Connect support to the PHP League's OAuth2 Server. Compatible with Laravel Passport.

59437.0k9](/packages/jeremy379-laravel-openid-connect)[duncanmcclean/statamic-cargo

Comprehensive e-commerce addon for Statamic. Build bespoke e-commerce sites without the complexity.

3417.0k](/packages/duncanmcclean-statamic-cargo)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
