2016-05-03 2 views
1

J'implémente des rôles et des permissions pour un projet, et j'utilise des politiques, mais j'ai un problème quand je veux autoriser ou non la création de nouveaux enregistrements dans la table des patients, très simple des trucs. J'ai dans mon PatientPolicyProblèmes avec la politique de création dans Laravel 5

// 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' 
]; 

PatientController

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'); 
} 

et dans mes vues

@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 

Le problème est que le CREA La politique retourne toujours false même pour les utilisateurs supposés être autorisés à effectuer l'action, mais la politique d'édition fonctionne parfaitement. Est-ce que je manque quelque chose?

+0

double possible de [Comment définir une méthode de politique sans argument dans Laravel 5.2?] (http://stackoverflow.com/questions/37242321/how-to-define-a-policy-method-with-no-argument-in-laravel-5-2) –

Répondre

0

Le problème est Gate::denies et @can méthodes ne sais pas quel modèle et la classe politique, ils devraient chercher quand il n'y a pas d'argument pour correspondre, donc à utiliser à la place de ce code:

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

et votre point de vue:

@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 

Vous pouvez vérifier ma réponse complète ici: https://stackoverflow.com/a/37261276/3477084