门系统和模型政策

时间:2016-03-04 16:56:54

标签: laravel laravel-5 laravel-5.2

我目前正试图了解您是否可以在政策中添加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>

1 个答案:

答案 0 :(得分:0)

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

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等方法传递的参数。