No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Políticas de acceso

21/23
Recursos

Aportes 8

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
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.

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

Para Agosto 2024 hay CAMBIOS importantes para (jugar) con los permisos. Se introdujo el concepto de GATES y se mantiene POLICIES. **Una Policy sigue usandose para dar permisos a los metodos del controlador.** Ahora se **registra** asi, pero dentro de AppServiceProvider: ```js public function boot(): void { Gate::policy(Repository::class, RepositoryPolicy::class); } ``` Y dentro del controlador se usa asi: ```js public function edit(Repository $repository) { Gate::authorize('pass', $repository); return view('repositories.edit', compact('repository')); } ```

Muy interesante…excelente curso. Aunque tengo mucho tiempo trabajando con Laravel, sabia que existian las Policies pero nunca las habia usado…me gusto muchisimo y efectivamente ayuda a que el codigo sea mas limpio…Laravel es quizas el framework de desarrollo web mas completo…al menos de php…

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

Para Laravel 11 deben agregar el trait ** AuthorizesRequests*.* Queda de esta forma ```js namespace App\Http\Controllers; use Illuminate\Foundation\Auth\Access\AuthorizesRequests; class RepositoryController extends Controller { use AuthorizesRequests; ```*use* Illuminate\Foundation\Auth\Access\AuthorizesRequests;
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.