我有四个表groups
,posts
,group_user
和group_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
})
});
语句轻松检查用户是否关注该组。但是如何授权用户使用策略发布。
答案 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,
// ...
];