Php Laravel 5.5:使用数据透视表的授权
我有四个表Php Laravel 5.5:使用数据透视表的授权,php,mysql,laravel,laravel-5,Php,Mysql,Laravel,Laravel 5,我有四个表用户,组,帖子,和组用户。用户可以跟随不同的组。group\u用户表用于多对多关系 每个帖子都属于一个组和一个用户。我希望用户只能在一个组中发布帖子,如果他跟随该组。我可以使用if语句轻松检查用户是否跟随该组。但是我如何授权用户使用策略进行发布呢 访问控制列表有一个复杂的解决方案。了解Zizaco委托图书馆。在这里,您可以为系统中的每个路由设置权限。通过该路由和权限,您可以准备几个组。 主题很难,但确实值得实施: 创建策略:php artisan make:policy 注册策略: c
用户
,组
,帖子
,和组用户
。用户可以跟随不同的组。group\u用户表
用于多对多关系
每个帖子都属于一个组和一个用户。我希望用户只能在一个组中发布帖子,如果他跟随该组。我可以使用
if
语句轻松检查用户是否跟随该组。但是我如何授权用户使用策略进行发布呢 访问控制列表有一个复杂的解决方案。了解Zizaco委托图书馆。在这里,您可以为系统中的每个路由设置权限。通过该路由和权限,您可以准备几个组。
主题很难,但确实值得实施:
创建策略:
php artisan make:policy
注册策略:
class AuthServiceProvider extends ServiceProvider
{
/**
* The policy mappings for the application.
*
* @var array
*/
protected $policies = [
Post::class => PostPolicy::class,
];
在您的策略中,逻辑如下:
public function create(User $user, Post $post)
{
$groupsOfUser = $user->groups()->get();
foreach ($groupsOfUser as $group) {
if($group->id == request('groupId'))return true;
}
}
在控制器中:
public function store(Post $post, $groupId)
{
$this->authorize('create', $post);
Post::create([
'user_id' =>auth()->id(),
'group_id' => $groupId,
'title' => 'sometitle',
]);
}
我已经用route进行了测试:
Route::get('/post/{groupId}', 'PostController@store');
但是,您可能通过输入获取groupId,但您了解了这个想法 对于这个问题似乎没有什么好的答案,因此我将与大家分享我为帮助将来寻找这个问题的人所做的工作 这是在Laravel5.8中测试过的,但我认为它至少可以在以前的几个版本中使用 首先创建一个轴心模型
use Illuminate\Database\Eloquent\Relations\Pivot;
class GroupUser extends Pivot {}
在用户
模型中更新您的组
关系
public function groups() {
return $this->belongsToMany(Group::class)
->using(GroupUser::class);
}
public function users() {
return $this->belongsToMany(User::class)
->using(GroupUser::class);
}
并更新组
模型中的用户
关系
public function groups() {
return $this->belongsToMany(Group::class)
->using(GroupUser::class);
}
public function users() {
return $this->belongsToMany(User::class)
->using(GroupUser::class);
}
创建您的GroupUserPolicy
类
use Illuminate\Auth\Access\HandlesAuthorization;
class GroupUserPolicy {
use HandlesAuthorization;
public function update(User $user, GroupUser $pivot) {
// check permissions
}
// additional authorization methods
}
如果不使用自动发现,请在AuthServiceProvider
中将它们链接起来
protected $policies = [
GroupUser::class => GroupUserPolicy::class,
// ...
];
然后,当您想要显示或更新透视图时,例如在控制器中,您可以将透视图传递给授权检查
$group = $user->groups()->where('group_id', $groupId)->firstOrFail();
$this->authorize('update', $group->pivot);
// or ...
foreach ($user->groups as $group) {
$this->authorize('update', $group->pivot);
}
这真的太宽泛了,请与代码分享具体问题。好的,试着找出一些关于这方面的信息。无论我在哪里都会更新这个问题。