2016-11-28 1 views
0

L'utilisateur admin peut voir tous les messages sur la page d'accueil et accéder à la page de mise à jour pour chaque postedynamique Autoriser l'accès à différentes règles d'autorisation - ACL Laravel

$gate->before(function(User $user, $ability) 
    { 
     if ($user->hasAnyRoles('adm')) 
      return true; 
    }); 

Ceci est ok

Mais je ne sais pas Ce que je fais de mal dans les politiques parce que les autres utilisateurs peuvent voir tous les messages à la page d'accueil mais ne peuvent pas accéder à la page de mise à jour qu'ils ont créée, l'accès est refusé.

Les autorisations sont dynamiques, j'ai les tables de la DB:

  • autorisations
  • permission_role
  • messages
  • rôles
  • role_user
  • utilisateurs

Accueil Contrôleur

<?php 

namespace App\Http\Controllers; 

use App\Http\Requests; 
use Illuminate\Http\Request; 
use App\Post; 
use Gate; 

class HomeController extends Controller 
{ 
    /** 
    * Create a new controller instance. 
    * 
    * @return void 
    */ 
    public function __construct() 
    { 
     $this->middleware('auth'); 
    } 

    /** 
    * Show the application dashboard. 
    * 
    * @return \Illuminate\Http\Response 
    */ 
    public function index(Post $post) 
    { 
     $posts = $post->all(); 
     return view('home', compact('posts')); 
    } 


    public function update($idPost) 
    { 
     $post = Post::find($idPost); 


     if(Gate::denies('update-post', $post)) 
      abort(403); 

     return view('update-post', compact('post')); 
    } 

} 

classe AuthServiceProvider

<?php 

namespace App\Providers; 

use Illuminate\Contracts\Auth\Access\Gate as GateContract; 
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider; 
use App\Post; 
use App\User; 
use App\Permission; 

class AuthServiceProvider extends ServiceProvider 
{ 
    /** 
    * The policy mappings for the application. 
    * 
    * @var array 
    */ 
    protected $policies = [ 

    ]; 


    /** 
    * Register any application authentication/authorization services. 
    * 
    * @param \Illuminate\Contracts\Auth\Access\Gate $gate 
    * @return void 
    */ 
    public function boot(GateContract $gate) 
    { 
     $this->registerPolicies($gate); 

     $permissions = Permission::with('roles')->get(); 
      foreach($permissions as $permission) 
      { 
       $gate->define($permission->name, function(User $user) use ($permission){ 
         return $user->hasPermission($permission); 
       }); 
      } 



     $gate->before(function(User $user, $ability) 
     { 
      if ($user->hasAnyRoles('adm')) 
       return true; 
     }); 

    } 
} 

modèle utilisateur

<?php 

namespace App; 

use Illuminate\Foundation\Auth\User as Authenticatable; 
use App\Permission; 

class User extends Authenticatable 
{ 
    /** 
    * The attributes that are mass assignable. 
    * 
    * @var array 
    */ 
    protected $fillable = [ 
     'name', 'email', 'password', 
    ]; 

    /** 
    * The attributes that should be hidden for arrays. 
    * 
    * @var array 
    */ 
    protected $hidden = [ 
     'password', 'remember_token', 
    ]; 

    public function roles() 
    { 
     return $this->belongsToMany(\App\Role::class); 
    } 

    public function hasPermission(Permission $permission) 
    { 
     return $this->hasAnyRoles($permission->roles); 
    } 

    public function hasAnyRoles($roles) 
    { 
     if(is_array($roles) || is_object($roles)){ 
      foreach($roles as $role){ 
       return $roles->intersect($this->roles)->count(); 
      } 
     } 
     return $this->roles->contains('name', $roles); 

    } 
} 

modèle Rôle

<?php 

namespace App; 

use Illuminate\Database\Eloquent\Model; 

class Role extends Model 
{ 
    public function permissions() 
    { 
     return $this->belongsToMany(\App\Permission::class); 
    } 
} 

modèle Permission

<?php 

namespace App; 

use Illuminate\Database\Eloquent\Model; 

class Permission extends Model 
{ 
    public function roles() 
    { 
     return $this->belongsToMany(\App\Role::class);  
    } 
} 

vue home.blade.php

@extends('layouts.app') 

@section('content') 
<div class="container"> 
    @forelse($posts as $post) 
     @can('view_post', $post) 
      <h2>{{$post->title}}</h2> 
      <p>{{$post->description}}</p><br> 
      <p>Autor: {{$post->user->name}}</p> 
      <a href="{{url("/post/$post->id/update")}}">Editar</a> 
     @endcan 
     <hr> 
    @empty 
     <p>No posts registered</p> 
    @endforelse 
</div> 
@endsection 

vue update-post.blade.php

@extends('layouts.app') 

@section('content') 
@can('edit_post', $post) 
<div class="container"> 
     <h2>{{$post->title}}</h2> 
     <p>{{$post->description}}</p><br> 
     <p>Autor: {{$post->user->name}}</p> 
@endcan 
@endsection 

Répondre

0

créer une classe politique:

php artisan make:policy PostPolicy --model=Post 

que dans votre AuthServiceProvider inscrire la politique:

protected $policies = [ 
    Post::class => PostPolicy::class, 
]; 

que dans la méthode de mise à jour PostPolicy faire ceci:

public function update(User $user, Post $post) 
{ 
    return $user->id === $post->user_id; 
} 

vous avez fait une erreur votre contrôleur domestique.

if(Gate::denies('update-post', $post)) 
    { 
     abort(403); 
    } 

ou vous pouvez faire la même chose en une seule ligne:

$this->authorize('update-post', $post); 

ou en utilisant peut middleware:

if ($user->can('update-post', $post)) { 
return view('update-post', compact('post')); 
} 
+0

Merci pour votre réponse. Pour les première et deuxième suggestions, l'accès est toujours refusé. La troisième suggestion renvoie: "Undefined variable: user" – Gislef

+0

maintenant essayer avec une nouvelle réponse éditée .. –

+0

J'ai mis à jour ma question s'il vous plaît voir – Gislef