daglab / laravel-redis-jwt
此包允许将JWT认证的用户及其角色、权限、状态等存储和管理在Redis中。
Requires
- php: >=8.0
- php-open-source-saver/jwt-auth: dev-main
- predis/predis: 2.0.*
- spatie/laravel-permission: 5.*
This package is auto-updated.
Last update: 2024-09-09 18:39:16 UTC
README
此包允许将JWT认证的用户及其角色、权限、状态等存储和管理在Redis中。
此外,此包还有一个观察者,用于监听和更新Redis中的用户模型。当您为用户分配角色和权限或更新和删除用户模型时,此观察者会被触发。
要求
此包与php-open-source-saver/jwt-auth: 和 spatie/laravel-permission 包配合使用。
- nrk/predis >= 1.1
- php-open-source-saver/jwt-auth: >= 1.4
- spatie/laravel-permission >= 5.5 (可选)
安装
composer require daglab/laravel-redis-jwt
完成后,您需要在 .env
文件中添加和更改以下值
CACHE_DRIVER=redis REDIS_CLIENT=predis
接下来,您需要根据以下方式更改您的 config/auth.php
配置中的 guards
和 providers
数组
<?php return [ 'guards' => [ 'api' => [ 'driver' => 'redis_jwt', 'provider' => 'users' ], ], 'providers' => [ 'users' => [ 'driver' => 'redis_jwt_user', 'model' => App\Models\User::class, /* Your User Model */ ], ], ];
此包使用自动发现来注册服务提供者,但如果您愿意手动进行,服务提供者在 config/app.php
配置的 providers
数组中添加如下
Daglab\RedisJWT\RedisJWTServiceProvider::class,
您可以使用以下命令发布配置
php artisan vendor:publish --provider='daglab\RedisJWT\RedisJWTServiceProvider'
配置
一切完成后,不要忘记将此特性添加到您的用户模型中,如果您打算使用 spatie/laravel-permission。
use RedisJWTHasRoles;
一切完成后,不要忘记将此特性添加到您的用户模型中,如果您不使用 laravel-permission
。
use RedisJWT;
您需要在 app/Http/Kernel.php
中添加 $routeMiddleware
数组
<?php return [ 'auth' => \daglab\RedisJWT\Http\Middleware\Authenticate::class, 'refreshable' => \daglab\RedisJWT\Http\Middleware\Refreshable::class, 'role' => \daglab\RedisJWT\Http\Middleware\RoleMiddleware::class, // Optional 'permission' => \daglab\RedisJWT\Http\Middleware\PermissionMiddleware::class, // Optional 'role_or_permission' => \daglab\RedisJWT\Http\Middleware\RoleOrPermissionMiddleware::class, // Optional ];
用法
没有使用说明。此包仅影响后台,与Laravel会话认证几乎以相同的方式工作,有一些例外。 您只需更改中间件。(我在下面提到这一点)
您可以使用Laravel的Auth门面、Tymon的JWTAuth门面以及所有 spatie/laravel-permission 包方法,就像平常一样。
- 对于基于令牌的用户认证;
(如果用户的身份不重要,请使用此中间件。此中间件仅检查令牌是否有效。不会向任何数据库发送查询。)
Route::get("/example", "ExampleController@example")->middleware('auth');
- 要检查用户授权,您需要使用以下其中一个中间件;
(如果用户的身份很重要,请使用此中间件。这些中间件将从Redis中获取用户并将其标记为已授权给Laravel的Request对象。您将能够使用所有想要的默认Auth门面方法。只需调用Laravel的Auth门面即可。)
Route::get("/example", "ExampleController@example")->middleware('role:admin|user'); Route::get("/example", "ExampleController@example")->middleware('permissions:get-user|set-user'); Route::get("/example", "ExampleController@example")->middleware('role_or_permission:admin|get-user');
- 要刷新令牌,您可以将
refreshable
中间件添加到所需的路由中。您不需要在此路由的控制器上执行任何操作;
(另外,此中间件如果需要也可以从 Redis 刷新用户。)
Route::get("/example", "ExampleController@example")->middleware('refreshable');
如果您想执行不同的操作,可以覆盖那些提到的中间件。
如上使用后,您在应用程序中创建的每个授权,如 Auth::user()
或 $user->can('permission')
,都将始终从 Redis 检查,而不是从数据库中检查。
选项
您可以在该包中自定义一些选项。检查 config/redis-jwt.php
文件。
- 用户模型
<?php return [ /* |-------------------------------------------------------------------------- | Your User Model |-------------------------------------------------------------------------- | | You can set specific user model. | */ 'user_model' => \App\Models\User::class, ];
- 观察者
<?php return [ /* |-------------------------------------------------------------------------- | RedisJWT User Model Observer |-------------------------------------------------------------------------- | | This observer class, listening all events on your user model. Is triggered | when you assign roles & permissions to user, or update and delete to | your user model. | */ 'observer' => daglab\RedisJWT\Observers\UserRedisObserver::class, ];
- 事件队列
<?php return [ /* |-------------------------------------------------------------------------- | Observer Events Are Queued |-------------------------------------------------------------------------- | | If this option is true, model's events are processed as a job on queue. | | * ~ Don't forget to run Queue Worker if this option is true. ~ * | */ 'observer_events_queue' => true, ];
- 缓存时间
<?php return [ /* |-------------------------------------------------------------------------- | Cache on Redis up to jwt_ttl value. |-------------------------------------------------------------------------- | | If it's option is true, user stored in Redis up to jwt_ttl value time. | */ 'redis_ttl_jwt' => true, /* |-------------------------------------------------------------------------- | Cache on Redis up to specific time |-------------------------------------------------------------------------- | | If you don't want to store user in Redis until JWT expire time, | you can set this value as minute. | */ 'redis_ttl' => 60, ];
- 缓存前缀
<?php return [ /* |-------------------------------------------------------------------------- | Cache Prefix |-------------------------------------------------------------------------- | | If it's user id is 1, this user stored in Redis as auth_1. | */ 'redis_auth_prefix' => 'auth_', ];
- 禁用用户检查
<?php return [ /* |-------------------------------------------------------------------------- | Banned User Checking |-------------------------------------------------------------------------- | | If the check_banned_user option is true, that users cannot access | the your application. | */ 'check_banned_user' => false, /* |-------------------------------------------------------------------------- | Status Column For Banned User Checking |-------------------------------------------------------------------------- | | You can set your specific column name of your user model. | */ 'status_column_title' => 'status', /* |-------------------------------------------------------------------------- | Restricted statuses For Banned User Checking |-------------------------------------------------------------------------- | | If the user has one of these statuses and trying to reach your application, | RedisJWT throws AccountBlockedException. | You can set the message (check it errors array) that will return in this | exception. | */ 'banned_statuses' => [ 'banned', 'deactivate' ], ];
- 关系缓存
<?php return [ /* |-------------------------------------------------------------------------- | Cache This Relations When User Has Authenticated |-------------------------------------------------------------------------- | | You can add this array to your own relations, anything you want to store | in Redis. We recommend caching only roles and permissions here as much as | possible. | */ 'cache_relations' => [ 'roles.permissions', 'permissions' ], ];
- 自定义异常
<?php return [ /* |-------------------------------------------------------------------------- | Customize All Exception Messages and Codes |-------------------------------------------------------------------------- | | You can customize error code,message,title for your application. | */ 'errors' => [ 'TokenNotProvidedException' => [ 'title' => 'Your custom title', 'message' => 'Your custom error message.', 'code' => 99999 ] ], ];
示例项目
这里有一个 laravel-redis-jwt 的示例。您可以详细了解。
性能改进技巧
此包默认需要 predis 包。
您可以通过 PECL 安装 PhpRedis PHP 扩展。扩展的安装更为复杂,但可能为大量使用 Redis 的应用程序带来更好的性能。Predis 是纯 PHP 上的 PhpRedis 的替代品,默认不需要任何额外的 C 扩展。
"PhpRedis 的速度大约快 6 倍。使用 igbinary 序列化器可以将存储的数据大小减少约 3 倍。如果 Redis 安装在独立的机器上,减少网络流量可以显著提高速度。"
在我看来,在生产环境中使用 PhpRedis 和 igbinary 序列化器(Lodash 包提供了这个功能)可以提供非常好的性能。
您可以查看这篇 文章 以比较 PhpRedis 和 Predis 的性能。
许可证
MIT © [RUSTAM MAKHMUDOV]