【问题标题】:Gate Fascade and Model Policies门立面和模型策略
【发布时间】:2016-03-04 16:56:54
【问题描述】:

我目前正在尝试了解您是否可以将 Gate Fascade 添加到策略中,或者是否有更好的方法来处理我的情况。

我有一个用户列表,每个用户都有一个角色,每个角色可以有很多权限。所有这些都存储在我的数据库中,并在我的模型中建立了正确的关系。

我正在尝试根据用户是否可以在我的 HTML 用户列表中删除另一个用户来显示或不显示删除图标。

例子:

假设 user1 的角色为 3,即站点管理员。站点管理员有权删除用户,但他们无法删除与他们具有相同角色或高于他们的角色的其他用户。

当 user1 访问 /users uri 时,他们会看到数据库中用户的 HTML 表,并且作为最后一个表列是可以在该用户行的行上执行的操作。可用的操作图标是编辑和删除。对于删除图标,我希望运行一个策略以确保经过身份验证的用户可以先删除用户,但也可以传递当前行的用户对象,并查看用户是否具有相同或更高的角色 ID,在这种情况下它不会显示图标。

<?php

namespace App\Policies;

use App\User;

use Illuminate\Auth\Access\HandlesAuthorization;

class UserPolicy
{
    use HandlesAuthorization;

    /**
     * Create a new policy instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    public function delete(User $user) {
        return Auth::user()->role->permission and $user->role_id < Auth::user()->role_id and $user->id != Auth::user()->id;
    }
}

/reources/views/partials/tables/actions.blade.php

<td class="actions">
    <a href="{{ route('users.edit', $user->id) }}" class="btn btn-sm btn-icon btn-pure btn-default" data-toggle="tooltip" data-original-title="Edit"><i class="icon wb-edit" aria-hidden="true"></i></a>
    <a href="{{ route('users.show', $user->id) }}" class="btn btn-sm btn-icon btn-pure btn-default" data-toggle="tooltip" data-original-title="Show"><i class="icon wb-eye" aria-hidden="true"></i></a>
    @can('delete-user', $user)
        <form class="inline" method="POST" action="{{ route('users.delete', [$user->id]) }}">
            {{ method_field('DELETE') }}
            <input type="hidden" name="_token" value="{{ csrf_token() }}">
            <button type="submit" class="btn btn-sm btn-icon btn-pure btn-default on-default" data-toggle="tooltip" data-original-title="Delete"><i class="icon wb-trash" aria-hidden="true"></i></button>
        </form>
    @endcan
</td>

【问题讨论】:

  • 那么你的问题是什么?
  • 如何检查是否代替 Auth::()->role->permission 我可以查看他们是否具有删除用户权限

标签: laravel laravel-5 laravel-5.2


【解决方案1】:

像这样重写你的策略方法(我使用你自己的语法并假设它是真的):

public function delete(User $authUser, User $user) {
    return $authUser->role->permission and
           $user->role_id < $authUser->role_id and
           $user->id != $authUser->id;
}

在您的策略方法中,第一个参数始终是您经过身份验证的用户,其他参数是您通过 @canGate::allow 等方法传递的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-20
    • 1970-01-01
    • 1970-01-01
    • 2016-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多