首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Laravel权限缓存

Laravel权限缓存
EN

Stack Overflow用户
提问于 2018-11-28 09:03:54
回答 3查看 3.2K关注 0票数 1

我在laravel中使用自己的用户角色和权限实现,如何在用户登录时缓存所有权限和角色,并在添加新记录时刷新缓存。我的表是users、roles、permissions、permission_role、permission_user、role_user。这是我的表结构

我已经创建了提供程序的,并将此代码添加到引导方法中

代码语言:javascript
复制
Permission::get()->map(function ($permission) 
            {
                Gate::define($permission->name, function ($user) use ($permission) 
                {
                    return $user->hasPermission($permission);
                });
            });

它工作得很好,但它每次都会运行查询,这会减慢我的应用程序是否有方法缓存所有权限

这是我的PermissionServiceProvider类

代码语言:javascript
复制
<?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()
    {
        //
    }
}

最后,在用户模型内部

代码语言:javascript
复制
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的方法,它可以很好地缓存permissions表中的所有permisisons,但是有没有办法保存所有的权限,以及指定用户和当前登录用户的角色的权限

EN

回答 3

Stack Overflow用户

发布于 2018-11-28 10:48:49

您可以使用Laravel模型缓存,如以下链接所示:

https://laravel-news.com/laravel-model-caching

我将创建一个方法来获取和缓存当前用户的角色和权限。

你可以在这里阅读更多关于缓存的内容:

https://laravel.com/docs/5.7/cache

我希望这能帮到你

更新

试试这样的东西

代码语言:javascript
复制
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花费的时间要长得多。

票数 0
EN

Stack Overflow用户

发布于 2018-11-28 11:45:27

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

代码语言:javascript
复制
$permissions = Cache::rememberForever('permissions', function () {
                    return Permission::get();
                 });

这将永远记住密钥名称为permissions的权限,直到您更改它为止

你也可以用特定的时间记住这一点。

代码语言:javascript
复制
 $permissions = Cache::remember('permissions', 3600, function () {
                        return Permission::get();
                     });

我将其放在应用程序服务提供商中,以便每次应用程序加载时检查是否在缓存中找到permissions,然后不运行查询,如果未找到,则从数据库中获取它

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

代码语言:javascript
复制
$permissions->map(function ($permission) 
            {
                Gate::define($permission->name, function ($user) use ($permission) 
                {
                    return $user->hasPermission($permission);
                });
            });

Laravel Documentation上查找更多信息

票数 0
EN

Stack Overflow用户

发布于 2019-07-25 12:50:12

最后我找到了解决方案。Artisan缓存清除命令不能正常工作。尝试删除此文件夹上的缓存。存储/框架/缓存/数据

这肯定能行得通。祝好运

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53510571

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档