Authorization: Understanding Policies in Laravel
Controlling what users can or cannot do in your application is one of the most essential things you'll need to do when building real-world applications.
For example, in a todo application, you don't want a user to be able to edit or delete other users' todos.
In this article, you will learn one of the seamless ways to do this in Laravel by using policies to control what users can do by building a simple todo application.
To follow along with this tutorial, you need to have a basic understanding of Laravel and its application structure.
Create a Base Application
Run the following command to create a new Laravel application in your desired folder and move into it:
composer create-project laravel/laravel todo-app && cd todo-app
Next, run the following command to install Laravel Breeze:
php artisan breeze:install
Breeze will scaffold your new application with authentication so your users can register, log in, log out, and view their personalized dashboards.
After that, compile your application assets by running the following commands:
npm install && npm run dev
Laravel comes with the file-based SQLite database by default, so the next thing you need to do is connect your application database file to a database viewer like TablePlus or any other one you like.
After connecting your database to the viewer, run the following commands to migrate the available tables into your database:
php artisan migrate
Once that is done, run the following command to view your application in the browser:
php artisan serve
You should now see your new Laravel application at localhost:8000 looking like this:
You can now go to the register page to create a user and access the dashboard, which is the entire application at this point.
Model Setup
Models in Laravel are used to control database tables. Use the following command to create a Todo model in the App/Models folder:
php artisan make:model Todo
Next, inside the newly created file, replace the Todo class with the following code:
class Todo extends Model { use HasFactory; protected $fillable = [ 'title', 'description', 'completed', 'user_id' ]; public function user() { return $this->belongsTo(User::class); } }
The code above will enable users to submit a form with the $fillable properties; it also defines the relationship between a user and a Todo; in this case, a todo belongs to a user. Let's complete the relationship setup by adding the following code to the App/Models/User.php file:
public function todos() { return $this->hasMany(Todo::class); }
The code above will connect the User model to the Todo model so that it can have many to-dos.
Migration Setup
Migrations in Laravel are used to specify what should be in a database table. Run the following command to create a migration inside the database/migrations folder:
composer create-project laravel/laravel todo-app && cd todo-app
Next, replace the up function in the new file with the following that will add the todo table to the database with the id, user_id, title, description, completed, and timestamp columns:
php artisan breeze:install
Next, run the following command to add the todos table to the database:
npm install && npm run dev
Policy Setup
Policies in Laravel allow you to define who can do what with a particular resource, in this case, todos.
Let's see how that works by generating a TodoPolicy inside the App/Policies folder using the following command:
php artisan migrate
Next, in the newly created TodoPolicy file, replace the TodoPolicy class with the following code:
php artisan serve
The code above specifies that a user can create a todo, but can only view, update, or delete a todo that belongs to them.
Next, let's set up the controller in the next section.
Controller Setup
Controllers in Laravel control the app's functionality for a particular resource. Run the following command to generate a TodoController inside the App/Http/Controllers:
php artisan make:model Todo
Add the following code to the top of the newly created TodoController file to import the Todo model for database operations and Gate class for authorization:
class Todo extends Model { use HasFactory; protected $fillable = [ 'title', 'description', 'completed', 'user_id' ]; public function user() { return $this->belongsTo(User::class); } }
Index Method
Replace the index method with the following code that fetches and returns all the logged-in users' todos:
public function todos() { return $this->hasMany(Todo::class); }
The Gate::authorize method verifies that the user is logged in using the viewAny policy method you defined in the previous section.
Create Method
Replace the create method with the following code that verifies the user is signed in before returning the create todo form to the user so they can create todos:
php artisan make:migration create_todos_table
Store Method
Replace the store method with the following code that checks if the user can create a todo, validates the request, creates the todo, and redirects the user to the todo list page:
public function up(): void { Schema::create('todos', function (Blueprint $table) { $table->id(); $table->foreignId('user_id')->constrained()->onDelete('cascade'); $table->string('title'); $table->text('description')->nullable(); $table->boolean('completed')->default(false); $table->timestamps(); }); }
Edit Method
Replace the edit method with the following code that verifies the user can edit that todo before returning the edit todo form populated with the selected todo to the user so they can edit it:
php artisan migrate
Update Method
Replace the update method with the following code that checks if the user can update the todo, validates the request, updates the selected todo, and redirects the user to the todo list page:
php artisan make:policy TodoPolicy --model=Todo
Destroy Method
Replace the destroy method with the following code that checks if the user can delete the todo, deletes it, and redirects the user to the todo list page:
class TodoPolicy { /** * Determine if the user can view any todos. */ public function viewAny(User $user): bool { return true; } /** * Determine if the user can view the todo. */ public function view(User $user, Todo $todo): bool { return $user->id === $todo->user_id; } /** * Determine if the user can create todos. */ public function create(User $user): bool { return true; } /** * Determine if the user can update the todo. */ public function update(User $user, Todo $todo): bool { return $user->id === $todo->user_id; } /** * Determine if the user can delete the todo. */ public function delete(User $user, Todo $todo): bool { return $user->id === $todo->user_id; } }
Your TodoController file should now look like this:
composer create-project laravel/laravel todo-app && cd todo-app
Views Setup
Now that your TodoController methods are all set, you can now create the views for your applications by creating a new todos folder inside the resources/views folder. After that, create create.blade.php, edit.blade.php, index.blade.php files in the new todos folder.
Index View
Paste the following code inside the index.blade.php:
php artisan breeze:install
Create View
Paste the following code inside the create.blade.php:
npm install && npm run dev
Edit View
Paste the following code inside the edit.blade.php:
php artisan migrate
Routes Setup
Handling routes for your TodoController is relatively straightforward using the resource method in Laravel. Do that by adding the following code to the end of the routes/web.php folder like so:
php artisan serve
The code above uses the auth middleware to protect the todos resource. You should now be able to visit the following routes in your application after being logged in:
- /todos: List all users' todos
- /todos/create: Shows the form for creating todos
- /todos/edit/1: Shows the form for editing a todo with the given id; 1 in this case.
You can now create, edit, and delete todos, BUT only as a logged-in user and the owner of the selected todos in the case of editing and deleting.
Conclusion
And that's it! You have just created a realistic todo application that allows users to create, view, edit, and delete ONLY their own todos. Please let me know if you have any corrections, suggestions, or questions in the comments!
Finally, remember to follow me here on Dev, LinkedIn, and Twitter. Thank you so much for reading, and I'll see you in the next one!
The above is the detailed content of Authorization: Understanding Policies in Laravel. For more information, please follow other related articles on the PHP Chinese website!

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics

Alipay PHP...

JWT is an open standard based on JSON, used to securely transmit information between parties, mainly for identity authentication and information exchange. 1. JWT consists of three parts: Header, Payload and Signature. 2. The working principle of JWT includes three steps: generating JWT, verifying JWT and parsing Payload. 3. When using JWT for authentication in PHP, JWT can be generated and verified, and user role and permission information can be included in advanced usage. 4. Common errors include signature verification failure, token expiration, and payload oversized. Debugging skills include using debugging tools and logging. 5. Performance optimization and best practices include using appropriate signature algorithms, setting validity periods reasonably,

Session hijacking can be achieved through the following steps: 1. Obtain the session ID, 2. Use the session ID, 3. Keep the session active. The methods to prevent session hijacking in PHP include: 1. Use the session_regenerate_id() function to regenerate the session ID, 2. Store session data through the database, 3. Ensure that all session data is transmitted through HTTPS.

The enumeration function in PHP8.1 enhances the clarity and type safety of the code by defining named constants. 1) Enumerations can be integers, strings or objects, improving code readability and type safety. 2) Enumeration is based on class and supports object-oriented features such as traversal and reflection. 3) Enumeration can be used for comparison and assignment to ensure type safety. 4) Enumeration supports adding methods to implement complex logic. 5) Strict type checking and error handling can avoid common errors. 6) Enumeration reduces magic value and improves maintainability, but pay attention to performance optimization.

The application of SOLID principle in PHP development includes: 1. Single responsibility principle (SRP): Each class is responsible for only one function. 2. Open and close principle (OCP): Changes are achieved through extension rather than modification. 3. Lisch's Substitution Principle (LSP): Subclasses can replace base classes without affecting program accuracy. 4. Interface isolation principle (ISP): Use fine-grained interfaces to avoid dependencies and unused methods. 5. Dependency inversion principle (DIP): High and low-level modules rely on abstraction and are implemented through dependency injection.

How to debug CLI mode in PHPStorm? When developing with PHPStorm, sometimes we need to debug PHP in command line interface (CLI) mode...

How to automatically set the permissions of unixsocket after the system restarts. Every time the system restarts, we need to execute the following command to modify the permissions of unixsocket: sudo...

Sending JSON data using PHP's cURL library In PHP development, it is often necessary to interact with external APIs. One of the common ways is to use cURL library to send POST�...
