INSTALACION Y USO DE COMPONENTE ENTRUST EN LARAVEL 5.2 parte 2

En este post mostrare de una manera detallada el uso del componente Entrust en partes de nuestro proyecto, y veremos lo facil que es. Continuando con la primera parte de este post.

Primero crearemos los roles el cual es facil, solo una instancia de la clase Role, a modo de prueba, para ir probando poco a poco podríamos crear una ruta y poner todo el codigo dentro de un clousure o sino usar el componente Tinker para los que no conocen es un compnente que mediante la consola interactuamos con nuestra aplicacion Hare una breve reseña sobre el uso de Tinker mas adelante.

Route::get('/prueba',function(){
    //aqui iria todo el código a ejecutar, para ver el uso de este componente pruebas 
});
$administrador=new Role(); 
$administrador->name = 'administrador'; 
$administrador->display_name = 'administrador del sistema'; 
$administrador->description = 'Usuario tipo admin del sistema'; 
$administrador->save(); 

$invitado = new Role(); 
$invitado->name = 'invitado'; 
$invitado->display_name = 'usuario invitado'; 
$invitado->description ='Usuario tipo invitado del sistema'; 
$invitado->save();

Ahora asociamos los roles a los usuarios tengamos en cuenta que ya deberíamos tener almenos un usuario

//obtenemos al usuario al que queremos asignar roles
$user = User::find(1);
//mediante la function attachRole() que es propia del componente, 
//podemos asignar el rol al usuario
$user->attachRole($administrador);
//Como sabemos que un usuario puede tener varios roles, facilmente hacemos algo como esto
$roles = Role::all();
//el resultado de esa consulta devolverá todos los roles en un array y luego los asignamos
//a un usuario
$user->attachRole($roles);

Continuamos con la creación de Permisos que es igual que la creación de roles

$crearPost = new Permission();
$crearPost->name = 'crear-post';
$crearPost->display_name = 'crear posts';
$crearPost->description  = 'crear nuevos posts al blog';
$crearPost->save();

$leerPost = new Permission();
$leerPost->name = 'leer-post';
$leerPost->display_name = 'leer posts';
$leerPost->description = 'leer posts del blog';
$leerPost->save();

Y asignamos los permisos a los roles.

//en este ejemplo asignamos el permiso de leer posts al rol invitado
$invitado->attachPermissions($leerPost);
//en aqui al igual que con los roles y usuarios un rol puede tener varios permisos
//y al rol administrador le asignamos los roles de crear post y leer post en un array
$administrador->attachPermission([$crearPost,$leerPost]);

Verificando los roles y permisos

//verificamos los roles de un usuario con la funcion hasRole() que es propia del componente
//esta función nos retornara un valor booleano, segun sea el caso
$user->hasRole('administrador'); //recibe como parametro string valido que sea igual al nombre del rol
$user->hasRole(['invitado','administrador']); //tambien recibe como parametro un array con los nombres de los roles validos

//verificamos los permisos del rol con la funcion can() que es propia del componente
//la función también devolverá un valor booleano
$user->can('eliminarPost');//igualmente recibe como parametro un string
$user->can(['eliminarPost','leerPost']);//recibe como parametro un array con los nombres de los permisos

De esta primera parte, en conclusion lo que hicimos fue:

  • crear los roles $administrador e $invitado
  • asignar los roles a un usuario
  • crear los permisos $crearPost y leerPost
  • asignar los permisos a los roles
  • verificamos roles y permisos

Ahora continuamos con el uso de en si de este componente en nuestra aplicación:

Propongamonos un caso, que les parece si estamos desarrollando un mini blog que tenga como una de sus características el uso de roles y permisos para todos los usuarios con los roles y permisos de tipo CRUD para los posts:

  • Usuario administrador tendrá permiso crearPost, leerPost, elimminarPost, comentarPost y actualizarPost
  • Usuraio miembro tendra permiso de leerPost, editarPost, crearPost y comentarPost
  • Usuario invitado tendra permiso solo de leerPost

Ejemplo de uso en un controller:

<?php namespace App\Http\Controllers; 
use Illuminate\Http\Request; 
use App\Http\Requests; 
use App\Post; 
use App\Comentario; 
use App\User; 
class PostController extends Controller {
 public function index() { 
      $post = Post::all(); 
      return view('post.index',compact('post')); 
 }

 public function create() { 
      //primero verificamos que el usuario inicie sesion para poder crear algun post 
      if(Auth::check()){ 
         return view('post.create');
      }else{ 
            return "inicie sesión para poder crear posts";
      } 
 } 

 public function store(Request $request) {
      //hacemos uso de las funciones para verificar el rol del usuario 
      if(Auth::user()->hasRole(['administrador','miembro'])){
      $post = new Post();
      $post->fill($request->all());
      $post->save();
      return "post creado...!!";
    }else{
      //si el usuario no cumple con los requisitos, retornamos un error 403
      return abort(403);
    }
 }

 public function show($id)
 {
       //a esta funcion si debe ser accesada por todos
       $post = Post::findOrFail($id);
       return view('posts.show',compact('post'));
 }

 public function edit($id)
 {
       $post = Post::findOrFail($id);//obtenemos el post
       return view('posts.edit',compact('post'));  
 }

 public function update(Request $request, $id)
 {
       $post = Post::findOrFail($id);//obtenemos el post
       //para hacer uso de esta función el usuario debería ya estar logueado y ademas ser el autor del post
       if(Auth::user()->id === $post->user_id){//verificamos si el usuario es autor del post
          if(Auth::user()->hasRole(['administrador','miembro'])){//verificamos los roles
             $post->update($request->all());
             return "post actualizado...!!!";
          }else{
               return "usted no tiene permisos para actualizar este post";
          }
       }else{
            return "usted no es autor del post";
       }
 }

 public function destroy($id)
 {
       $post = Post::findOrFail($id);
       if(Auth::user()->hasRole('administrador')){
          $post->delete();
          return "post eliminado...!!";
       }else{
            return "no estas autorizado para eliminar este post";
       }
 }
}
 

Ejemplo de uso en la vista:

@extends('layouts.app')
@section('content')
<div class="container">
<div class="col-lg-6 col-lg-offset-3">

<div class="panel panel-default">
           <div class="panel-heading">
           crear posts
           </div>
           <div class="panel-body">
              <table class="table table-hover">
                 <th>
                    <td>Id</td>
                    <td>Titulo</td>
                    <td>Contenido</td>
                    <td>Accion</td>
                 </th>
                 @foreach($posts as $post)
                 <tr>
                    <td>{{$post->id}}</td>
                    <td>{{$post->titulo}}</td>
                    <td>{{$post->contenido}}</td>
                    <td>
                       <!-- el boton de editar solo se mostrara para los usuarios con permiso de eliminar y editar -->
                       @permission('editarPost')
                         <a href="route('post.edit',$post->id)" class="btn btn-warning">Editar post</button>
                       @endpermission
                       <!-- el boton de eliminar solo sera visible para el usuario con rol administrador -->
                       <!-- tanto las funciones permission() y role() reciben como parametro un array con los nombres de los permisos y roles -->
                       @role('administrador')
                         <form action="route('post.destroy',$post)" method="DELETE">
                         {{csrf_field()}}
                         <button type="submit" class="btn btn-danger">Eliminar post</a>
                         </form>
                       @endrole
                    </td>
                 </tr>
                 @endforeach
              </table>
            </div>
       </div>
   </div>
</div>
@endsection

Uso del componente en las rutas con sus middlewares:

//en este ejemplo agrupamos la ruta con prefijo admin y donde solo pueden ingresar los usuarios con rol administrador
Route::group(['prefix' => 'admin', 'middleware' => ['role:administrador']], function() {
    Route::resource('post', 'PostController');
});

//tambien pueden ir por roles separados con el | 
'middleware' => ['role:administrador|miembro']

//para dejar pasar a los usuarios con un o mas determinado permiso
'middleware' => ['permission:crearPost', 'permission:editarPost']

Bueno eso es todo cualquier duda o sugerencia por favor me lo hacen saber en los comentarios