当前位置: 首页 > 知识库问答 >
问题:

Laravel权限缓存

郁光熙
2023-03-14

我在laravel中使用自己的用户角色和权限实现如何缓存用户登录时的所有权限和角色,以及在添加新记录时刷新缓存。我的表是users、roles、permissions、permission\u role、permission\u user、role\u 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。吉特

我试过emtiaz zahid的方法https://stackoverflow.com/a/53511803/8487424在权限表中缓存所有权限是可行的,但是否有任何方法可以缓存所有权限以及指定用户的权限和当前登录用户的角色

共有3个答案

虞唯
2023-03-14

终于找到解决办法了。工匠缓存清除命令效果不佳。尝试删除此文件夹上的缓存。存储/框架/缓存/数据

这肯定会奏效。祝你好运

闻人浩波
2023-03-14

您可以将缓存存储在服务提供商中。我只是分享我的方法

$permissions = Cache::rememberForever('permissions', function () {
                    return Permission::get();
                 });

这将永远记住具有键名权限的权限,直到您更改它

你也可以在特定时间记住这一点

 $permissions = Cache::remember('permissions', 3600, function () {
                        return Permission::get();
                     });

我将其放置在app service provider中,以便每次加载app时检查是否在缓存中找到权限,然后不运行查询,如果未找到权限,则从DB中获取

因此,在缓存部分之后,您的脚本可以如下所示:

$permissions->map(function ($permission) 
            {
                Gate::define($permission->name, function ($user) use ($permission) 
                {
                    return $user->hasPermission($permission);
                });
            });

了解更多Laravel文档

潘英豪
2023-03-14

您可以使用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();

    }

}

然后,您只需要更新您的haspowmission()方法来检查缓存。

还要尽量避免map(),因为php比sql花费的时间要长得多

 类似资料:
  • 我需要空间/Laravel权限的帮助。当我试图分配它给我错误哎呀,看起来像出了问题。 错误 Connection.php第761行中的QueryExcema:SQLSTATE[23000]:完整性约束冲突:1048列role_id不能为空(SQL:插入到(,)值(9,))

  • 我正在Centos 7发行版上安装Laravel应用程序。我使用的是PHP7.2,我已经成功地安装了apache和我的项目。 我能够得到Apache闪屏页面显示,但一旦我指向我的虚拟主机laravel公共文件夹,我得到apache2日志中的文件权限错误。 我已经让我的公共文件夹和存储文件夹都被所有人读/写/执行了很短的一段时间,但我仍然收到错误。 我的虚拟主机: 我的权限(在公共和引导临时chmo

  • 因此,我的Laravel项目中有以下文件夹组织: 公共 user_images group_images img css 供应商 等... 所以我的问题是,当用户上传图像时,我将其移动到文件夹user#image,然后使用干预图像使其变小,使用image::make(#folder),然后重新调整其大小,最后保存它。但要做到这一点,文件夹用户_映像需要特殊权限,使用chmod 777,我可以使其正

  • 问题内容: 我已经将laravel存储库克隆到了CentOS 7盒中。当我尝试运行它时,出现500错误,但未显示任何内容。 因此,我进行了检查,发现有一些权限错误: 我做了以下尝试来克服这些问题: 所以现在显示如下: 但这没有用。 有趣的是,我之前输入了一些错误的命令,这些命令似乎将日志添加到日志文件中。 问题答案: 我找到了答案,解决了我的问题。 通过关闭命令来证明这是问题所在 这应该允许写入,

  • 我已经搜索了几个小时了,但找不到解决方案,即使有类似的问题。 我试图在一个全新的laravel安装上运行php artisan tinker,用户是网站管理员(项目目录demo的所有者),但我遇到了以下错误: 使用详细标志运行: 异常跟踪:照亮\Foundation\Bootstrap\HandleExceptions- 希望有人能给我一个提示。谢谢 分布:Raspbian GNU/Linux8(

  • 问题内容: 我正在使用拥有者设置为的Apache Web服务器。我永远都不知道文件权限的最佳做法是什么,例如,当我创建新的Laravel 5项目时。 Laravel 5要求文件夹可写。我发现了很多不同的方法可以使其正常工作,而我通常以递归方式使其成为chmod。我知道这不是最好的主意。 官方文件说: Laravel可能需要配置一些权限:Web服务器中的文件夹, 并且需要Web服务器进行写访问。 这