Al igual que hicimos con las notas, crearemos un API con acceso restringido por JWTokens y, para cierta ruta, haremos que sólo los usuarios con el role de administrador, puedan hacer cierta acción.
De forma general, un usuario podrá Crear, Mostrar, Borrar y Actualizar su propio perfil pero aquellos con «role» sea «admin» podran listar los usuarios, para ello:
- Crearemos un middleware que protega el método «index» del controlador resource de usuarios para uso exclusivo de Administradores.
- Crearemos un controlador de tipo resource.
- Protegeremos cada uno de los métodos para que sólo se pueda hacer CRUD el usuario autenticado sobre su propio usuario, es decir, un usuario sólo podrá eliminar su propio usuario y no el enviado en la peticion, salvo que sea usuario con rol admin, en caso contrario, enviaremos al Front-End, una respuesta de no autorizado.
- Añadir la ruta al archivo de rutas de tipo api.
Empezamos por el middleware que protegerá la ruta de usuarios:
1 |
php artisan make:middleware RoleMiddleware |
Editamos el archivo:
1 2 3 4 5 6 7 8 9 10 11 |
class RoleMiddleware { public function handle($request, Closure $next, $role) { if ($request->user()->role != $role) { return response()->error('unauthorized', 401); } return $next($request); } } |
Turno del API RESTful de usuarios:
1 |
php artisan make:controller --resource Api\V1\UserController |
Editamos el controlador de usuarios:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 |
<?php namespace App\Http\Controllers\Api\V1; use App\Http\Controllers\Controller; use App\Http\Requests\CreateUserRequest; use App\Http\Requests\UpdateUserRequest; use App\Traits\Upload; use App\User; use Illuminate\Http\Request; use Tymon\JWTAuth\Facades\JWTAuth; class UserController extends Controller { use Upload; public function __construct() { $this->middleware('role:admin', ['only' => ['index']]); $this->middleware('auth:api', ['except' => ['store']]); $this->user = \Auth::user(); } public function index() { $users = User::all()->sortByDesc("created_at"); return response()->success(compact('users')); } public function store(CreateUserRequest $request) { try { $url = $this->upload($request->image); $user = new User([ 'role' => 'user', 'name' => $request->name, 'email' => $request->email, 'avatar' => $request->avatar, 'image' => $url['original'], 'thumbnail' => $url['thumbnail'], ]); $user->save(); return response()->success(compact('user')); } catch (Exception $e) { return response()->error('error_creating_user', $e->getStatusCode()); } } public function show($id) { $user = User::findOrFail($id); if ($this->user->id != $user->id && $this->user->role != "admin") { return response()->error('unauthorized', 401); } $user->ip = \Request::ip(); return $user; } public function update(UpdateUserRequest $request, $id) { $user = User::findOrFail($id); if ($this->user->id != $user->id && $this->user->role != "admin") { return response()->error('unauthorized', 401); } $url = $this->upload($request->image); $user->email = $request->email; $user->name = $request->name; $user->image = $url['original']; $user->thumbnail = $url['thumbnail']; if ($request->password != "") { $user->password = $request->password; } try { $user->save(); $newToken = JWTAuth::parseToken()->refresh(); return response()->success(compact('user'))->header('Authorization', 'Bearer ' . $newToken); } catch (Exception $e) { return response()->error('error_updating_profile', $e->getStatusCode()); } return $user; } public function destroy($id) { $user = User::findOrFail($id); if ($this->user->id != $user->id && $this->user->role != "admin") { return response()->error('unauthorized', 401); } try { $user->delete(); } catch (Exception $e) { return response()->error('error_deleting_user', $e->getStatusCode()); } return response('success', 200); } } |
Por último, así quedaría el archivo de rutas:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Route::group(['guard' => 'api'], function () { Route::group(['prefix' => 'v1'], function () { Route::group(['middleware' => 'auth:api'], function () { Route::post('notes/{note}', 'Api\V1\NoteController@update'); Route::resource('notes', 'Api\V1\NoteController', ['except' => ['create', 'edit']]); }); Route::post('users/{user}', 'Api\V1\UserController@update'); Route::resource('users', 'Api\V1\UserController', ['except' => ['create', 'edit']]); }); }); |