首页 > 解决方案 > 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的方法,它可以很好地缓存所有表中的内容permisisonspermissions但是有什么方法可以缓存所有权限以及当前特定用户和角色的权限登录用户

标签: laravel

解决方案


您可以使用 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 需要更长的时间


推荐阅读