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);
}

这真的太宽泛了,请与代码分享具体问题。好的,试着找出一些关于这方面的信息。无论我在哪里都会更新这个问题。