Laravel 5 中创建策略的问题

Posted

技术标签:

【中文标题】Laravel 5 中创建策略的问题【英文标题】:Problems with the create policy in Laravel 5 【发布时间】:2016-08-27 22:24:29 【问题描述】:

我正在为一个项目实施角色和权限,并使用策略,但是当我想要授权或不授权在患者表中创建新记录时遇到问题,非常简单的事情。 我的 PatientPolicy 中有这个

// Only the users with root or admin roles can create patients;
public function create(User $user)
    return ($user->hasRole('root') || $user->hasRole('admin'));


// only the patient creator can edit the patient and see the edit button
public function update(User $user, Patient $patient)
    return $user->id == $patient->user_id;

AuthServiceProvider

protected $policies = [
    'App\Model' => 'App\Policies\ModelPolicy',
    'App\Patient' => 'App\Policies\PatientPolicy'
];

病人控制器

public function edit(Patient $patient)
    if(Gate::denies('update', $patient))
        abort(403, 'No esta autorizado de estar aqui');
    
    return view('patients.edit', compact('patient'));


public function create()
    if(Gate::denies('create'))
        abort(403, 'Usted no esta autorizado para crear pacientes');
    
    return view('patients.create');

在我看来

@can('create')
    <li class="header">PROCESOS</li>
    <li><a href="/paciente/create"><i class="fa fa-book"></i> <span>Apertura de Historia Clínica</span></a></li>
@endcan

问题在于,即使对于那些本应被允许执行操作的用户,创建策略也总是返回 false,但编辑策略运行良好。我错过了什么吗?

【问题讨论】:

How to define a policy method with no argument in Laravel 5.2?的可能重复 【参考方案1】:

问题是Gate::denies@can 方法在没有对应的参数时不知道应该查找哪个模型和策略类,因此请改用以下代码:

public function create()
    if(Gate::denies('create', Patient::class)) 
        abort(403, 'Usted no esta autorizado para crear pacientes');
    
    return view('patients.create');

在你看来:

@can('create', App\Patient::class)
    <li class="header">PROCESOS</li>
    <li><a href="/paciente/create"><i class="fa fa-book"></i> <span>Apertura de Historia Clínica</span></a></li>
@endcan

你可以在这里查看我的完整答案: https://***.com/a/37261276/3477084

【讨论】:

以上是关于Laravel 5 中创建策略的问题的主要内容,如果未能解决你的问题,请参考以下文章

在 Laravel 5.4 中创建表单的最佳方法是啥?

在 Laravel 5.1 中创建 superAdmin 中间件

如何在 Laravel 5.2 中创建多重身份验证

在迁移 laravel 5.2 中创建数据库视图

如何使用 laravel 5.8 在控制器中创建条件?

如何在 Laravel 5 中创建表迁移