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
Pingback: Instalacion y uso de componente Entrust en Laravel 5.2 | Laravel-Blog
Una duda de donde sale este $post = Post::all(); –> Post
Me gustaMe gusta
Williams, lo que esta haciendo ahí, es llamar al model Pots, que es el de la tabla posts, es decir, el realizo una migración que creo una tabla posts, donde se guardaran los posts del sistema o página web. Es lo que explica cuando propone el caso de un mini blog, con tres tipos de usuarios o roles, espero haber explicado claro y haber ayudado a tu duda.
Me gustaMe gusta
lo que va después del Rote son controladores?
Me gustaMe gusta
consulta. el código que va después de Route, ¿son controladores?
No entiendo donde va cada código, excepto donde dice controlador y vista, pero en el otro no especificas donde van.
saludos y gracias
Me gustaMe gusta
Ese código va en el archivo Route, el archivo de rutas, y dentro de este esta usando el método resource, que es el que llama a la distintas funciones o métodos del controlador. En el método group, pasa como parámetro el middleware para verificar si tiene acceso a las rutas que van dentro del grupo de rutas, y el prefix, se refiere a que todas las rutas que comiencen con admin deberán pasar por la validación del middleware e irse a la ruta correspondiente, en el caso de ejemplo, la ruta seria admin/post, de pasar la validación. Espero haber ayudado. Saludos
Me gustaMe gusta
sera que puedes mostrar donde colocas el código donde creas los roles y permisos porque no se entiende esa parte gracias!!! de antemano
Me gustaMe gusta
muy bueno!! tengo una consulta, cuando se crea la migracion post, que atributos tiene? y se relaciona con alguna otra tabla?
Me gustaMe gusta
Buen ejemplo, explicación exquisita.Saludos.
Me gustaMe gusta
Gracias Kevin, suerte.
Me gustaMe gusta
Gracias, muy bien explicado!
Saludos.
Me gustaMe gusta
Hola saludos espero que me pueda ayudar quiero realizar un modulo de permiso, ya se que existen componente para ello pero quiero aplicarlo a una estructura no comun
un administrador registra varias empresa y como se le da permiso al usuario por empresa suponiendo que esta sean las empresa:
Empresa-A
Empresa-B
Usuario-B
Usuario-A
el Usuario-A tiene permiso de crear en la Empresa-A y en la Empresa-B solo puede ver como podria hacer eso aplicado que pueda acceder a un lado o a otro espero que me pueda ayudar muchas gracias
Me gustaMe gusta
Malísimo el tutorial, no de centro en el uso del componente, solo en instalación y configuración, y además se hace un mal uso del componente, no se uso los permisos ni middleware.
Me gustaMe gusta
Reblogueó esto en Gustavo Herrera.
Me gustaMe gusta
Hola chicos yo tengo mi crud de usaruis, y solo tengo dos roles, admin y member, pero al momento de querer asignar el rol no puedo alguien me ayuda?? dejo mi codigo storeque tengo
public function store(Request $request , $id)
{
$user = new User($request->all());
$user->password = bcrypt($request->password);
//$user->save();
$user = User::find($id);
$user->attachRole($roles);
flash(«Se ha registrado «.$user->name.» de forma exitosa!», ‘success’)->important();
return redirect()->route(‘users.index’);
}
Me gustaMe gusta
Excelente explicación, más clara que en la documentación del componente !!!
Me gustaMe gusta
hola la parte de los roles podria mostrar mas completo la captura del codigo no me ubico
Me gustaMe gusta