laravel 5.6

https://laravel.com/docs/5.6/authorization

只有登陆后才可以判断

传入的第一个参数必须是 User 模型 第二个字段是自定义内容

返回值
true 表示有权限
false 表示无权限

创建

php artisan make:policy PostPolicy --model=User

编辑 App\Policies\PostPolicy

默认有 view create update delete 这几种方法

1
2
3
4
5
6
7
8
9
10
11
12

// 在 Policy 中会在所有方法执行前调用
public function before(User $user)
{
# code...
}

public function view(User $user, $post)
{
return $user->id == $post->user_id
}

注册 App\Providers\Policies

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 第一种
protected $policies = [
'App\Models\User' => 'App\Policies\PostPolicy',
];

// 第二种
public function boot()
{
$this->registerPolicies();

Gate::define('checkId', function ($user, $id) {
return $user->id == $id;
});

Gate::define('update articles', 'ArticlePolicy@update');
}

使用

https://laravel-china.org/articles/5479/the-introduction-of-laravel-authorization-methods-gate-and-policy

##Gate 门面:

Gate::allows('update articles', $article)
Gate::denies('update articles', $article)

Controller:

$this->authorize('update articles', $article)

Blade 模板:

@can('update articles', $article)
@cannot('update articles', $article)

User Model 实例:

$user->can('update articles', $article)
$user->cannot('update articles', $article)

other

为何会想到这个

源于自己的一个提问 (增删改查中如何防止横向越权?)
感谢 ibrand 回答

横向越权操作和纵向越权操作。前者指的是攻击者尝试访问与他拥有相同权限的用户的资源;而后者指的是一个低级别攻击者尝试访问高级别用户的资源。
https://bbs.csdn.net/topics/392259649

比方说 前端传来一个 id
后端进行增删改查
如何防止 有效的用户 对 非自己的 资源进行操作
laravel 中应该把这部分代码放在哪里

关于认证失败返回 403 而不是 401 错误

原文

Understanding 403 Forbidden
18 July 2011
There’s a problem with 401 Unauthorized, the HTTP status code for authentication errors. And that’s just it: it’s for authentication, not authorization. Receiving a 401 response is the server telling you, “you aren’t authenticated–either not authenticated at all or authenticated incorrectly–but please reauthenticate and try again.” To help you out, it will always include a WWW-Authenticate header that describes how to authenticate.
This is a response generally returned by your web server, not your web application.
It’s also something very temporary; the server is asking you to try again.
So, for authorization I use the 403 Forbidden response. It’s permanent, it’s tied to my application logic, and it’s a more concrete response than a 401.
Receiving a 403 response is the server telling you, “I’m sorry. I know who you are–I believe who you say you are–but you just don’t have permission to access this resource. Maybe if you ask the system administrator nicely, you’ll get permission. But please don’t bother me again until your predicament changes.”
In summary, a 401 Unauthorized response should be used for missing or bad authentication, and a 403 Forbidden response should be used afterwards, when the user is authenticated but isn’t authorized to perform the requested operation on the given resource.
Well that’s my view on it anyway :)

译文

了解403禁止
2011年7月18日
401 Unauthorized验证错误的HTTP状态代码存在问题。就是这样:它用于身份验证,而不是授权。收到401响应是服务器告诉您,“您未经过身份验证 - 未经过身份验证或未经过身份验证 - 但请重新进行身份验证并重试。”为了帮助您,它将始终包含WWW-Authenticate描述如何进行身份验证。
这是您的Web服务器通常返回的响应,而不是您的Web应用程序。
这也是非常暂时的; 服务器要求您再试一次。
因此,对于授权,我使用403 Forbidden响应。它是永久性的,它与我的应用程序逻辑联系在一起,而且它比401更具体。
收到403响应是服务器告诉你,“对不起。我知道你是谁 - 我相信你说的是谁 - 但你只是没有权限访问这个资源。也许如果您很好地询问系统管理员,您将获得许可。但是,在你的困境发生变化之前,请不要再打扰我了。“
总之,401 Unauthorized响应应该用于丢失或错误的身份验证,并且403 Forbidden应该在用户经过身份验证但未被授权对给定资源执行请求的操作时使用响应。
嗯,这是我对它的看法无论如何:)