【问题标题】:Use Gate in laravel在 laravel 中使用 Gate
【发布时间】:2023-01-12 03:38:35
【问题描述】:

我有一个Server。我需要禁止编辑 Server 给那些没有创建它的用户。但是有个问题,Server可能有很多Users可以编辑。我把它放在一个单独的数据库表 ServerUserCreate 中,其中存储了 server_iduser_id

它不适合我。由于Server表中没有user_id列,因为很多用户可以推荐

Gate::define('server-edit', function (User $user, Server $server) {
    return $user->id === $server->user_id;
});

我不知何故需要比较

ServerUserCreates->server_id === $server->id || Auth::user()->id === ServerUserCreate->user_id

如果它们相等,则访问是开放的。但我完全不知道如何在Gate中做到这一点

ServerUserCreate

Schema::create('server_user_creates', function (Blueprint $table) {
    $table->engine = 'InnoDB';
    $table->id();
    $table->unsignedBigInteger('server_id');
    $table->unsignedBigInteger('user_id');
    $table->index('server_id', 'suc_server_idx');
    $table->index('user_id', 'suc_user_idx');
    $table->foreign('server_id', 'suc_server_fk')->on('servers')->references('id');
    $table->foreign('user_id', 'suc_user_fk')->on('users')->references('id');
    $table->timestamps();
});

【问题讨论】:

    标签: php laravel gate


    【解决方案1】:

    我能够自己找出问题所在。也许它会对某人有所帮助,这是我的解决方案

    Gate::define('server-edit', function (User $user, Server $server) {
        $ServerUsers = $server->servers()->get();
        foreach ($ServerUsers as $ServerUser) {
            if ($ServerUser->server_id === $server->id && $ServerUser->user_id === $user->id) {
                return Response::allow();
            }
        }
        return Response::deny();
    });
    
    if (! Gate::allows('server-edit', $server)) {
        abort(403, 'Stop Stop!');
    }
    

    服务器型号

    public function servers()
    {
        return $this->hasMany(ServerUserCreate::class);
    }
    

    【讨论】:

      猜你喜欢
      • 2020-04-02
      • 1970-01-01
      • 2017-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-12
      • 2021-07-31
      相关资源
      最近更新 更多