Laravel 5.5:使用数据透视表进行授权

时间:2017-12-08 07:39:20

标签: php mysql laravel laravel-5

我有四个表groupspostsgroup_usergroup_user table。用户可以关注不同的群组。 if用于多对多关系。

每个帖子都属于一个组和一个用户。我希望用户只有在跟随该组的情况下才能在组上发帖。我可以使用$(document).ready(function(){ $(".page-scroll").click(function(){ $(".page-scroll").removeClass("active"); //removes current active class $(this).addClass("active"); // adds active class to specific click }) }); 语句轻松检查用户是否关注该组。但是如何授权用户使用策略发布。

3 个答案:

答案 0 :(得分:1)

制定政策: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::get('/post/{groupId}', 'PostController@store');

但你可能会通过输入获得groupId,但你明白了。

答案 1 :(得分:0)

访问控制列表有一个复杂的解决方案。了解Zizaco Entrust Library。您可以在此处为系统中的每个路径设置权限。通过该路由和权限,您可以准备几个组。 主题很难,但实际上值得实施: https://github.com/Zizaco/entrust

答案 2 :(得分:0)

对此似乎没有任何好的答案,所以我将分享我的工作,以帮助将来寻求此功能的任何人。

这已在laravel 5.8中进行了测试,但我认为它至少可以支持几个版本。

首先创建数据透视模型

<algorithm>

use Illuminate\Database\Eloquent\Relations\Pivot; class GroupUser extends Pivot {} 模型中更新您的groups关系

User

并在public function groups() { return $this->belongsToMany(Group::class) ->using(GroupUser::class); } 模型中更新您的users关系

Group

创建您的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,
    // ...
];