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
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
maintenant essayer avec une nouvelle réponse éditée .. –
J'ai mis à jour ma question s'il vous plaît voir – Gislef