Laravel如何使用spatie权限中间件?
How to use spatie permission middleware in Laravel?
我正在使用 Laravel 8 和 Spatie 角色和权限。每个动作的许可工作正常。但是,如果我将 delete action 权限分配给子管理员,但我直接从 URL 中点击 create action middlware 无法像用户那样停止操作没有创建权限。
public function __construct(CustomerInterface $customerInterface)
{
$this->customerInterface = $customerInterface;
$this->middleware(['permission:create_customer|delete_customer|edit_customer|chnage_customer_status']);
}
我在构造函数中使用上述中间件。我该如何解决这个问题。
据我从 documentation 中得知,当您使用具有多个权限的 permission
中间件时,如果 至少 一个权限签出。
您需要的是基于方法的授权,为此,Laravel 使用 policies,它默认允许您为常用方法编写单独的授权。 (索引、存储、更新、显示等)
假设您允许用户仅在拥有 create_customer
权限的情况下使用 store
方法,您的策略将如下所示:
/**
* Determine whether the user can create models.
*
* @param User $user
* @return mixed
*/
public function create(User $user)
{
return $user->can('create_customer');
}
然后在您的控制器中,放置 authorizeResource
函数将默认策略方法与您的默认资源控制器方法相关联:
public function __construct(CustomerInterface $customerInterface)
{
$this->customerInterface = $customerInterface;
$this->authorizeResource(Customer::class); // assuming your model name is Customer
}
或者,您可以编写自己的自定义策略方法并通过 $this->authorize
方法使用它们,该方法在 here.
中有进一步的记录
我正在使用 Laravel 8 和 Spatie 角色和权限。每个动作的许可工作正常。但是,如果我将 delete action 权限分配给子管理员,但我直接从 URL 中点击 create action middlware 无法像用户那样停止操作没有创建权限。
public function __construct(CustomerInterface $customerInterface)
{
$this->customerInterface = $customerInterface;
$this->middleware(['permission:create_customer|delete_customer|edit_customer|chnage_customer_status']);
}
我在构造函数中使用上述中间件。我该如何解决这个问题。
据我从 documentation 中得知,当您使用具有多个权限的 permission
中间件时,如果 至少 一个权限签出。
您需要的是基于方法的授权,为此,Laravel 使用 policies,它默认允许您为常用方法编写单独的授权。 (索引、存储、更新、显示等)
假设您允许用户仅在拥有 create_customer
权限的情况下使用 store
方法,您的策略将如下所示:
/**
* Determine whether the user can create models.
*
* @param User $user
* @return mixed
*/
public function create(User $user)
{
return $user->can('create_customer');
}
然后在您的控制器中,放置 authorizeResource
函数将默认策略方法与您的默认资源控制器方法相关联:
public function __construct(CustomerInterface $customerInterface)
{
$this->customerInterface = $customerInterface;
$this->authorizeResource(Customer::class); // assuming your model name is Customer
}
或者,您可以编写自己的自定义策略方法并通过 $this->authorize
方法使用它们,该方法在 here.