An Introduction to Laravel Policy

30 Dec 2018 . Laravel. 7.6K views

If you heard about Laravel Policy and still not yet use that, this introduction to Laravel Policy post is for you then. In this tutorial, I will write a real-life tutorial that, how to use Laravel Policy for the beginner.

What is Laravel Policy

Laravel policy is a part of Authorization of Laravel that help you to protect content or resources from unauthorized access.

Just imagine a simple concept that you have a blog that contains users and posts. Normally the post can be visible to every visitor, however, to edit a post, you need to be the owner of the post. In this tutorial, I will show you how to show the edit post option to the post owner only.

The basic concept of this apps is-

  1. A user can create a post
  2. A post can be viewed by visitor / user
  3. The post creator only can edit the post
  4. The post creator only can able to delete

Basic Configuration

First, let's connect with Database. In your .env file, update like follow. My database name is laravel-policy.

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel-policy
DB_USERNAME=root
DB_PASSWORD=

Next, need to create the migration, model and controller for posts and users table.

php artisan make:model User -m -c
php artisan make:model Post -m -c

Let's define migration now.

User

Schema::create('users', function (Blueprint $table) {
$table->increments('id');
$table->string('username');
$table->string('email')->unique();
$table->string('password');
$table->rememberToken();
$table->timestamps();
});

Post

Schema::create('posts', function (Blueprint $table) {
$table->increments('id');
$table->string('title');
$table->text('deatils');
$table->integer('user_id');
$table->integer('flag');
$table->timestamps();
});

Once, you have done this part, now run the migration.

php artisan migrate

If everything goes smoothly, you will see two tables in your database called users and posts. Now you may record data in your tables. You may go for seeding data or add manually. To keep this tutorial show, I just skip this step.

Create Policy

The ideal way to define a policy is to follow the model name. In our case, our model name is Post, so that our policy name should be PostPolicy to the authorized user to edit or delete. The artisan command to do that is-

php artisan make:policy PostPolicy

This command make:policy will generate an empty policy class in the App\Policies folder. In addition, you can suffix --model=Post to create CRUD.

Writing Policy

Now, let write the policy for the post where the post id is 1 that belongs to a user who's id is 1. So, the post is available to view from any user or visitor, however, in order to update or delete, you need to be a user who's id is 1.

Now, defining the update method to restrict the update option from mass people.

<?php

namespace App\Policies;

use App\User;
use App\Post;
use Illuminate\Auth\Access\HandlesAuthorization; class PostPolicy
{
use HandlesAuthorization; /**
* Determine if the given post can be updated by the user.
*
* @param \App\User $user
* @param \App\Post $post
* @return bool
*/
public function update(User $user, Post $post)
{
return $user->id === $post->user_id;
}
}

This update method will check whether the post creator is this user or not. It will return true once it matches otherwise, returns false.

Registering a Policy.

Once you have defined policy, you need to register the policy in the app/Providers/AuthServiceProvider.

<?php

namespace App\Providers;

use App\Post;
use App\Policies\PostPolicy;
use Illuminate\Support\Facades\Gate;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider; class AuthServiceProvider extends ServiceProvider
{
/**
* The policy mappings for the application.
*
* @var array
*/
protected $policies = [
'App\Model' => 'App\Policies\ModelPolicy',
Post::class => PostPolicy::class
];
}

How to use

Once you are in this stage that means, you have done everything successfully. Now, you need to use that.

Via View

In the view, you can use @can and @cannot directive.

@can('update', $post)
<!-- The Current User Can Update The Post -->
@endcan
@cannot('update', $post)
<!-- The Current User Can't Update The Post -->
@endcannot

Via Model

In the model, you can use in the following way-

if ($user->can('update', $post)) {
//
}

Via Controller

Even you can use via controller also. Cool, right?

public function update(Request $request, Post $post)
{
$this->authorize('update', $post); // The current user can update the blog post...
}

Sweet. Hope, you will like this. If you love this, feel free to share.

You can get this code in the following repository. https://github.com/laravel-school/introduction-laravel-policy

Thank you.

An Introduction to Laravel Policy的更多相关文章

  1. A Quick Introduction to Linux Policy Routing

    A Quick Introduction to Linux Policy Routing 29 May 2013 In this post, I’m going to introduce you to ...

  2. Laravel policy 的应用

    Laravel 提供更简单的方式来处理用户授权动作.类似用户认证,有 2 种主要方式来实现用户授权:gates 和策略,我这里主要讲解下策略的使用. 文档 上面有详细的说明,我这里只根据自己使用过程做 ...

  3. 使用 Laravel 实现微型博客系统

    参考链接:An Introduction to Laravel Authorization Gates 这个微型博客系统包含两个用户角色(作者 和 编辑),它们的权限如下: 作者能创建博客 作者能更新 ...

  4. PHP and laravel知识点小小积累

    function () use ($x, &$y){} 自从PHP5.3开始有了closure/匿名函数的概念,在这里的use关键词的作用是允许匿名函数capture到父函数scope 内存在 ...

  5. Laravel Gate 授权方式的使用指南

    参考链接:An Introduction to Laravel Authorization Gates 本文使用 Laravel 的 Gate 授权方式 实现一个基于用户角色的博客发布系统. 在系统包 ...

  6. Laravel 5.8: Automatic Policy Resolution

    Laravel 5.8: Automatic Policy Resolution March 26, 2019 One of the new features in Laravel 5.8 allow ...

  7. Laravel策略(Policy)示例

    场景:当前用户创建的订单,只能当前用户自己看,可以通过授权策略类(Policy)来实现 1.php artisan make:policy OrderPolicy 成功后,默认只有一个构造方法.因为涉 ...

  8. laravel/lumen 单元测试

    Testing Introduction Application Testing Interacting With Your Application Testing JSON APIs Session ...

  9. Machine Learning Algorithms Study Notes(1)--Introduction

    Machine Learning Algorithms Study Notes 高雪松 @雪松Cedro Microsoft MVP 目 录 1    Introduction    1 1.1    ...

随机推荐

  1. pandas之聚合运算

    通过聚合运算可以得到我们比较感兴趣的数据以方便处理 import pandas as pd import numpy as np # 先创建一组数据表DataFrame df = pd.DataFra ...

  2. (转)从0移植uboot (一) _配置分析

    ref : https://www.cnblogs.com/xiaojiang1025/p/6106431.html 本人建议的uboot学习路线,先分析原有配置,根据现有的配置修改.增加有关的部分, ...

  3. SpringCloud Hystrix 参数

    hystrix.command.default和hystrix.threadpool.default中的default为默认CommandKey Command PropertiesExecution ...

  4. 【SQL Server DBA】日常巡检语句3:特定监控(阻塞、top语句、索引、作业)

    原文:[SQL Server DBA]日常巡检语句3:特定监控(阻塞.top语句.索引.作业) 1.查询阻塞信息.锁定了哪些资源 --1.查看阻塞信息 select spid,loginame,wai ...

  5. C# 关于爬取网站数据遇到csrf-token的分析与解决

    需求 某航空公司物流单信息查询,是一个post请求.通过后台模拟POST HTTP请求发现无法获取页面数据,通过查看航空公司网站后,发现网站使用避免CSRF攻击机制,直接发挥40X错误. 关于CSRF ...

  6. Java Web-JSTL

    Java Web-JSTL 概念 Java Server Pages Tag Library:JSP标准标签库 是由Apache组织提供的开源.免费JSP标签 用于简化和替换JSP页面上的Java代码 ...

  7. Python 多进程编程

    import multiprocessing import time import os import random g_nums = [11, 22, 33] def test1(): while ...

  8. sql 给相同属性的数据排序

    UPDATE b SET OrderIndex = a.OrderIndex FROM ( SELECT RTRIM(ROW_NUMBER() OVER ( PARTITION BY [ItemID] ...

  9. dockerfile构建nginx

    mkdir docker_demo cd docker_demo wget http://nginx.org/download/nginx-1.2.9.tar.gz vim Dockerfile FR ...

  10. java入门学习总结_03

    1.键盘录入 2.分支结构 键盘录入 概述 1.键盘录入:在程序运行的过程中,可以让用户录入一些数据,存储在内存的变量中,在后续的程序运行过程中,可以使用这些数据. 2.步骤: 第一步:导包,在类声明 ...