No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

Pol铆ticas de acceso

21/23
Recursos

Aportes 7

Preguntas 1

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

php artisan make:policy RepositoryPolicy
php artisan test

Modificaciones:

  • app/Http/Controllers/RepositoryController.php
  • app/Policies/RepositoryPolicy.php
  • app/Providers/AuthServiceProvider.php

Interesante, no conoc铆a lo de las pol铆ticas aunque ahora veo que se le puede sacar mucho provecho, yo hab铆a propuesto usar un middleware aunque las pol铆ticas igual se ven interesantes 馃 Tambi茅n podr铆amos usar las pol铆ticas dentro de los middlewares jaja 馃憖. Les dejo la documentaci贸n por si a alguien le interesa:
.
https://laravel.com/docs/8.x/authorization#creating-policies

Se pudiera utilizar owner en lugar de pass creo que seria un nombre m谩s explicito para nuestra policy

Muy interesante鈥xcelente curso. Aunque tengo mucho tiempo trabajando con Laravel, sabia que existian las Policies pero nunca las habia usado鈥e gusto muchisimo y efectivamente ayuda a que el codigo sea mas limpio鈥aravel es quizas el framework de desarrollo web mas completo鈥l menos de php鈥

Les dejo mi commit de la clase
https://github.com/jlbousing/practica-tdd/commit/6f7f881171a8fc812151cf2483a7b6b0e378b417

En la versi贸n m谩s reciente de Laravel, espec铆ficamente Laravel 11.10.0., ha habido algunos cambios significativos en la estructura y la configuraci贸n del framework. Uno de esos cambios incluye la forma en que se maneja la autenticaci贸n y la autorizaci贸n. Les comparto como lo realice por si alguno se encuentra en el mismo punto que yo.\ auth()->user()->repositories聽 聽 聽 聽 ]);聽 聽 } 聽 聽 public function show(Repository $repository)聽 聽 {聽 聽 聽 聽 *$this*->authorize('pass', $repository); 聽 聽 聽 聽 *return* view('repositories.show', compact('repository'));聽 聽 } 聽 聽 public function create()聽 聽 {聽 聽 聽 聽 *return* view('repositories.create');聽 聽 } 聽 聽 public function store(RepositoryRequest $request)聽 聽 {聽 聽 聽 聽 $request->user()->repositories()->create($request->all()); 聽 聽 聽 聽 *return* redirect()->route('repositories.index');聽 聽 } 聽 聽 public function edit(Repository $repository)聽 聽 {聽 聽 聽 聽 *$this*->authorize('pass', $repository); 聽 聽 聽 聽 *return* view('repositories.edit', compact('repository'));聽 聽 } 聽 聽 public function update(RepositoryRequest $request, Repository $repository)聽 聽 {聽 聽 聽 聽 *$this*->authorize('pass', $repository); 聽 聽 聽 聽 $repository->update($request->all()); 聽 聽 聽 聽 *return* redirect()->route('repositories.edit', $repository);聽 聽 } 聽 聽 public function destroy(Repository $repository)聽 聽 {聽 聽 聽 聽 *$this*->authorize('pass', $repository); 聽 聽 聽 聽 $repository->delete(); 聽 聽 聽 聽 *return* redirect()->route('repositories.index');聽 聽 }} namespace App\Providers; use Illuminate\Support\ServiceProvider;use Illuminate\Support\Facades\Gate;use App\Models\Repository;use App\Policies\RepositoryPolicy; class AppServiceProvider extends ServiceProvider{聽 聽 */\*\*聽 聽 聽\* Register any application services.聽 聽 聽\*/*聽 聽 public function register(): void聽 聽 {聽 聽 聽 聽 *//*聽 聽 } 聽 聽 */\*\*聽 聽 聽\* Bootstrap any application services.聽 聽 聽\*/*聽 聽 public function boot(): void聽 聽 {聽 聽 聽 聽 *// Registrar la pol铆tica para el modelo Repository*聽 聽 聽 聽 Gate::policy(Repository::class, RepositoryPolicy::class);聽 聽 }} namespace App\Policies; use App\Models\Repository;use App\Models\User;use Illuminate\Auth\Access\HandlesAuthorization; class RepositoryPolicy{聽 聽 use HandlesAuthorization; 聽 聽 */\*\*聽 聽 聽\* Determine if the given repository can be accessed by the user.聽 聽 聽\*聽 聽 聽\* @param 聽\App\Models\User 聽$user聽 聽 聽\* @param 聽\App\Models\Repository 聽$repository聽 聽 聽\* @return bool聽 聽 聽\*/*聽 聽 public function pass(User $user, Repository $repository)聽 聽 {聽 聽 聽 聽 *// Define tu l贸gica de autorizaci贸n aqu铆*聽 聽 聽 聽 *return* $user->id === $repository->user\_id;聽 聽 }} Despues de que crees RepositoryPolicy.php debes de realizar algunas importanciones, quedar铆a asi el archivo final: ```js id === $repository->user_id; } } ```Luego en el AppServiceProvider.php debes manejar otras importaciones y Registrar la pol铆tica para el modelo Repository: ```js auth()->user()->repositories ]); } public function show(Repository $repository) { $this->authorize('pass', $repository); return view('repositories.show', compact('repository')); } public function create() { return view('repositories.create'); } public function store(RepositoryRequest $request) { $request->user()->repositories()->create($request->all()); return redirect()->route('repositories.index'); } public function edit(Repository $repository) { $this->authorize('pass', $repository); return view('repositories.edit', compact('repository')); } public function update(RepositoryRequest $request, Repository $repository) { $this->authorize('pass', $repository); $repository->update($request->all()); return redirect()->route('repositories.edit', $repository); } public function destroy(Repository $repository) { $this->authorize('pass', $repository); $repository->delete(); return redirect()->route('repositories.index'); } } ```Espero haber ayudado en este paso.
La autorizaci贸n de las politicas se puede hacer directamente desde el formRequest para dejar aun mas limpio el controlador: Ac谩 un ejemplo donde dependiendo de si vamos a actualizar o a crear le paso diferentes valores, pero podria ser tranquilamente una sola condici贸n como en la clase: ```js public function authorize(): bool { $response = false; switch ($this->method()) { case 'PUT': $response = $this->user()->can("update", $this->repository); break; case 'POST': $response = $this->user()->can("create", Repository::class); break; default: $response = false; break; } return $response; ; } ```Lo hice de esta manera porque para crear le voy a pedir solamente que este logueado, pero para actualizar debe ser el due帽o de el repositorio.