假设我的系统Sam
,John
和Sarah
中有三个用户。
这三个角色均具有editor
的角色,这赋予了他们对create article
,edit article
,publish article
和delete article
的权限。
现在由于某种原因,我不希望Sam
拥有对delete article
的许可,但仍然拥有editor
的角色。
如何使用此spatie / laravel-permission包在Laravel中实现此目标?
(假设我可能必须定期执行此操作,并且一段时间后我可能会再次将delete article
分配回Sam
。而且任何角色的权限太多,因此我无法手动完成。)
答案 0 :(得分:0)
您可以创建自定义策略。
在“策略”中,为您的用户或用户组设置例外。
创建和保存您的策略。(https://laravel.com/docs/6.x/authorization#creating-policies)
示例政策
<?php
namespace App\Policies;
use App\User;
use App\Article;
use Illuminate\Auth\Access\HandlesAuthorization;
class ArticlePolicy
{
use HandlesAuthorization;
/**
* Determine whether the user can delete the article.
*
* @param \App\User $user
* @param \App\Post $post
* @return mixed
*/
public function delete(User $user, Article $article)
{
// retrieve the user as you wish.
// I just did a check with his name but it is preferable to have a more
// advanced identification.
if ($user->name = 'SAM')) {
return false;
}
if ($user->can('delete article')) {
return true;
}
}
}
答案 1 :(得分:0)
MySQL数据库中有一个表 role_has_permissions ,该表包含您的 article-list , article-create ,权限表中的>商品存储和商品删除。
因此,在您的控制器中,您需要撤消对这些功能的访问,
function __construct()
{
parent::__construct();
$this->middleware('permission:article-list|article-create|article-store|article-delete', ['only' => ['index']]);
$this->middleware('permission:article-create', ['only' => ['store']]);
$this->middleware('permission:article-edit', ['only' => ['update']]);
$this->middleware('permission:brance-delete', ['only' => ['delete']]);
}
在刀片中显示类似这样的删除按钮(如果您的用户有权删除文章)
if (Auth::user()->hasPermissionTo('article-delete'))
{
<button type="button" class="btn btn-danger">Delete Article</button>
}