laravel - Laravel 权限缓存
问题描述
我在 laravel 中使用自己的用户角色和权限实现如何缓存用户登录时的所有权限和角色,以及在添加新记录时刷新缓存。我的表是用户、角色、权限、permission_role、permission_user、role_user。这是我的表结构
我已经创建了提供程序并将此代码添加到启动方法
Permission::get()->map(function ($permission)
{
Gate::define($permission->name, function ($user) use ($permission)
{
return $user->hasPermission($permission);
});
});
它工作正常,但每次都在运行查询,这会减慢我的应用程序是否有任何方法可以缓存所有权限
这是我的 PermissionServiceProvider 类
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Gate;
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\Facades\Blade;
use App\Models\Permission;
class PermissionServiceProvider extends ServiceProvider
{
/**
* Bootstrap services.
*
* @return void
*/
public function boot()
{
if (Schema::hasTable('permissions'))
{
Permission::get()->map(function ($permission)
{
Gate::define($permission->name, function ($user) use ($permission)
{
return $user->hasPermission($permission);
});
});
}
Blade::directive('role', function ($role)
{
return "<?php if(Auth::user()->hasRole({$role})): ?>";
});
Blade::directive('endrole', function ($role)
{
return "<?php endif; ?>";
});
}
/**
* Register services.
*
* @return void
*/
public function register()
{
//
}
}
最后在用户模型中
public function hasPermission($permission)
{
return $this->hasPermissionThroughRole($permission) || (bool) $this->permissions->where('name',$permission->name)->count();
}
public function hasPermissionThroughRole($permission)
{
foreach($permission->roles as $role)
{
if($this->roles->contains($role))
{
return true;
}
}
return false;
}
这也是我的比特桶回购
https://manojkiran@bitbucket.org/manojkiran/userrolesandpermissions.git
我已经尝试过@emtiaz-zahid
https://stackoverflow.com/a/53511803/8487424的方法,它可以很好地缓存所有表中的内容permisisons
,permissions
但是有什么方法可以缓存所有权限以及当前特定用户和角色的权限登录用户
解决方案
您可以使用 Laravel 模型缓存,如以下链接所示:
https://laravel-news.com/laravel-model-caching
我将创建一种方法来获取和缓存当前用户的角色和权限。
您可以在此处阅读有关缓存的更多信息:
https://laravel.com/docs/5.7/cache
我希望这有帮助
更新
尝试这样的事情
if (Schema::hasTable('permissions') ) {
$userId = Auth::user()->id
return Cache::remember($this->cacheKey() . $userId . ':permissions', 60, function() use ($userId) {
return Permission::where('user_id', $userId)->get();
}
}
然后你只需要更新你的hasPermission()
方法来检查缓存。
也尽量避免map()
,因为 php 比 sql 需要更长的时间
推荐阅读
- wordpress - 有没有一种有效的方法可以在 bitnami nginx 中安装 wordpress?
- python - 具有其他数据框条件的平均 Pandas 数据框
- forms - 在使用 enctype multipart 提交 html 表单时生成编译警告
- r - 更改文件名中某些字符的名称和位置
- python - OPENCV - !ssize.empty()
- angular-material - 特定材料图标未离线显示
- c++ - 如何在 VSCode C++ 编译期间修复 g++ 错误?
- nginx - Nginx Alias 没有提供正确的路径
- javascript - 如何使用量角器运行 senario 1000 次
- java - CET 和欧洲/布拉格有什么区别?