Middleware | laravel-permission | Spatie

 SPATIE

  Laravel Permission
=====================

spatie.be/open-source

  [Docs](https://spatie.be/docs)  [Laravel-permission](https://spatie.be/docs/laravel-permission/v8)  Basic-usage  Middleware

 Version   v8   v7   v6   v5   v4   v3

 Other versions for crawler [v8](https://spatie.be/docs/laravel-permission/v8) [v7](https://spatie.be/docs/laravel-permission/v7) [v6](https://spatie.be/docs/laravel-permission/v6) [v5](https://spatie.be/docs/laravel-permission/v5) [v4](https://spatie.be/docs/laravel-permission/v4) [v3](https://spatie.be/docs/laravel-permission/v3)

  Middleware
- [ Introduction ](https://spatie.be/docs/laravel-permission/v8/introduction)
- [ Support us ](https://spatie.be/docs/laravel-permission/v8/support-us)
- [ Prerequisites ](https://spatie.be/docs/laravel-permission/v8/prerequisites)
- [ Installation in Laravel ](https://spatie.be/docs/laravel-permission/v8/installation-laravel)
- [ Upgrading ](https://spatie.be/docs/laravel-permission/v8/upgrading)
- [ Questions and issues ](https://spatie.be/docs/laravel-permission/v8/questions-issues)
- [ Changelog ](https://spatie.be/docs/laravel-permission/v8/changelog)
- [ About us ](https://spatie.be/docs/laravel-permission/v8/about-us)

Basic Usage
-----------

- [ Basic Usage ](https://spatie.be/docs/laravel-permission/v8/basic-usage/basic-usage)
- [ Direct Permissions ](https://spatie.be/docs/laravel-permission/v8/basic-usage/direct-permissions)
- [ Using Permissions via Roles ](https://spatie.be/docs/laravel-permission/v8/basic-usage/role-permissions)
- [ Enums ](https://spatie.be/docs/laravel-permission/v8/basic-usage/enums)
- [ Teams permissions ](https://spatie.be/docs/laravel-permission/v8/basic-usage/teams-permissions)
- [ Wildcard permissions ](https://spatie.be/docs/laravel-permission/v8/basic-usage/wildcard-permissions)
- [ Blade directives ](https://spatie.be/docs/laravel-permission/v8/basic-usage/blade-directives)
- [ Defining a Super-Admin ](https://spatie.be/docs/laravel-permission/v8/basic-usage/super-admin)
- [ Using multiple guards ](https://spatie.be/docs/laravel-permission/v8/basic-usage/multiple-guards)
- [ Artisan Commands ](https://spatie.be/docs/laravel-permission/v8/basic-usage/artisan)
- [ Middleware ](https://spatie.be/docs/laravel-permission/v8/basic-usage/middleware)
- [ Passport Client Credentials Grant usage ](https://spatie.be/docs/laravel-permission/v8/basic-usage/passport)
- [ Example App ](https://spatie.be/docs/laravel-permission/v8/basic-usage/new-app)

Best Practices
--------------

- [ Roles vs Permissions ](https://spatie.be/docs/laravel-permission/v8/best-practices/roles-vs-permissions)
- [ Model Policies ](https://spatie.be/docs/laravel-permission/v8/best-practices/using-policies)
- [ Performance Tips ](https://spatie.be/docs/laravel-permission/v8/best-practices/performance)

Advanced usage
--------------

- [ Testing ](https://spatie.be/docs/laravel-permission/v8/advanced-usage/testing)
- [ Database Seeding ](https://spatie.be/docs/laravel-permission/v8/advanced-usage/seeding)
- [ Exceptions ](https://spatie.be/docs/laravel-permission/v8/advanced-usage/exceptions)
- [ Extending ](https://spatie.be/docs/laravel-permission/v8/advanced-usage/extending)
- [ Cache ](https://spatie.be/docs/laravel-permission/v8/advanced-usage/cache)
- [ Events ](https://spatie.be/docs/laravel-permission/v8/advanced-usage/events)
- [ Custom Permission Check ](https://spatie.be/docs/laravel-permission/v8/advanced-usage/custom-permission-check)
- [ UUID/ULID ](https://spatie.be/docs/laravel-permission/v8/advanced-usage/uuid)
- [ PhpStorm Interaction ](https://spatie.be/docs/laravel-permission/v8/advanced-usage/phpstorm)
- [ Other ](https://spatie.be/docs/laravel-permission/v8/advanced-usage/other)
- [ Timestamps ](https://spatie.be/docs/laravel-permission/v8/advanced-usage/timestamps)
- [ UI Options ](https://spatie.be/docs/laravel-permission/v8/advanced-usage/ui-options)

 Middleware
==========

###  On this page

1. [ Default Middleware ](#content-default-middleware)
2. [ Package Middleware ](#content-package-middleware)
3. [ Using Middleware in Routes and Controllers ](#content-using-middleware-in-routes-and-controllers)
4. [ Middleware via Static Methods ](#content-middleware-via-static-methods)

Default Middleware
--------------------------------------------------------------------------------------------------------------

For checking against a single permission (see Best Practices) using `can`, you can use the built-in Laravel middleware provided by `\Illuminate\Auth\Middleware\Authorize::class` like this:

```
use Illuminate\Support\Facades\Route;

Route::middleware('can:publish articles')->get(...);

// or with static method
use Illuminate\Auth\Middleware\Authorize;
Route::middleware(Authorize::using('publish articles'))->get(...);
```

Package Middleware
--------------------------------------------------------------------------------------------------------------

**See a typo? Note that since v6 the *'Middleware'* namespace is singular. Prior to v6 it was *'Middlewares'*. Time to upgrade your implementation!**

This package comes with `RoleMiddleware`, `PermissionMiddleware` and `RoleOrPermissionMiddleware` middleware.

You can register their aliases for easy reference elsewhere in your app:

Open `/bootstrap/app.php` and register them there:

```
// ...
use Spatie\Permission\Middleware\RoleMiddleware;
use Spatie\Permission\Middleware\PermissionMiddleware;
use Spatie\Permission\Middleware\RoleOrPermissionMiddleware;

return Application::configure(basePath: dirname(__DIR__))
    // ...
    ->withMiddleware(function (Middleware $middleware) {
        $middleware->alias([
            'role' => RoleMiddleware::class,
            'permission' => PermissionMiddleware::class,
            'role_or_permission' => RoleOrPermissionMiddleware::class,
        ]);
    })
    // ...
```

### Middleware Priority

If your app is triggering *404 Not Found* responses when a *403 Not Authorized* response might be expected, it might be a middleware priority clash. Explore reordering priorities so that this package's middleware runs before Laravel's `SubstituteBindings` middleware. (See [Middleware docs](https://laravel.com/docs/master/middleware#sorting-middleware) ).

If needed, you could optionally explore `$middleware->prependToGroup()` instead. See the Laravel Documentation for details.

Using Middleware in Routes and Controllers
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

After you have registered the aliases as shown above, you can use them in your Routes and Controllers much the same way you use any other middleware:

### Routes

```
// You can apply middleware to a group of routes:
Route::middleware('role:manager')->group(function () {
    // ...
});

// Or, for individual routes, apply the middleware directly:
Route::middleware('role:manager')->get('/admin', ...);
Route::middleware('permission:publish articles')->get('/articles/create', ...);
Route::middleware('role_or_permission:publish articles')->get('/articles/{id}', ...);

// for a specific guard:
Route::middleware('role:manager,api')->get('/api/admin', ...);

// multiple middleware
Route::middleware([
    'role:manager',
    'permission:publish articles'
])->get('/admin/publish', ...);
```

You can specify multiple roles or permissions with a `|` (pipe) character, which is treated as `OR`:

```
Route::middleware('role:manager|writer')
Route::middleware('permission:publish articles|edit articles')
Route::middleware('role_or_permission:manager|edit articles')

// for a specific guard
Route::middleware('permission:publish articles|edit articles,api')
```

### Controllers

If your controller implements the `HasMiddleware` interface, you can register [controller middleware](https://laravel.com/docs/12.x/controllers#controller-middleware) using the `middleware()` method:

```
use Illuminate\Routing\Controllers\HasMiddleware;
use Illuminate\Routing\Controllers\Middleware;

use Spatie\Permission\Middleware\RoleMiddleware;
use Spatie\Permission\Middleware\PermissionMiddleware;

class ArticleController implements HasMiddleware
{
    public static function middleware(): array
    {
        return [
            // examples with aliases, pipe-separated names, guards, etc:
            'role_or_permission:manager|edit articles',
            new Middleware('role:author', only: ['index']),
            new Middleware(RoleMiddleware::using('manager'), except:['show']),
            new Middleware(PermissionMiddleware::using('delete records,api'), only:['destroy']),
        ];
    }
}
```

Alternatively, you can use the [middleware attribute](https://laravel.com/docs/13.x/controllers#middleware-attributes) or the [authorization attribute](https://laravel.com/docs/13.x/controllers#authorization-attributes) to apply middleware to your controller classes or methods:

```
use Illuminate\Routing\Attributes\Controllers\Middleware;
use Illuminate\Routing\Attributes\Controllers\Authorize;

use Spatie\Permission\Middleware\RoleMiddleware;

class ArticleController
{
    #[Middleware(RoleMiddleware::using('manager'), only: ['index'])]
    public function index()
    {
        // ...
    }

    #[Authorize('publish articles')]
    public function store()
    {
        // ...
    }
}
```

You can also use Laravel's Model Policy feature in your controller methods. See the Model Policies section of these docs.

Middleware via Static Methods
-----------------------------------------------------------------------------------------------------------------------------------------------

All of the middleware can also be applied by calling the static `using` method, which accepts either an array or a `|`-separated string as input.

```
use Spatie\Permission\Middleware\RoleMiddleware;
Route::middleware(RoleMiddleware::using('manager'))

use Spatie\Permission\Middleware\PermissionMiddleware;
Route::middleware(
    PermissionMiddleware::using('publish articles|edit articles')
)

use Spatie\Permission\Middleware\RoleOrPermissionMiddleware;
Route::middleware(
    RoleOrPermissionMiddleware::using(['manager', 'edit articles'])
)
```

 A good
match?
-------------

### What we do best

- All things Laravel
- Custom frontend components
- Building APIs
- AI-powered features
- Simplifying things
- Clean solutions
- Integrating services

### Not our cup of tea

- WordPress themes
- Cutting corners
- Free mockups to win a job
- "Just execute the briefing"

 In short: we'd like to be a **substantial part** of your project.

 [ Get in touch via email ](mailto:info@spatie.be?subject=A%20good%20match%21&body=Tell%20us%20as%20much%20as%20you%20can%20about%0A-%20your%20online%20project%0A-%20your%20planning%0A-%20your%20budget%0A-%20%E2%80%A6%0A%0AAnything%20that%20helps%20us%20to%20start%20straightforward%21)
