我有users
,app_roles
,app_permissions
,app_permission_app_role
,app_role_user
。
这些表是不言自明的,我正在创建权限,然后在创建角色时将该权限分配给新角色,然后我将角色分配给用户。
我检查已验证用户的权限,如:
@if(auth()->user()->can('some route name'))
Html...
@endif
上面的条件检查用户是否可以访问该内容(基于所分配的角色),因为我们知道该角色具有权限,并且can('some route name')
参数是路由名称。 工作正常。
我被困在哪里!!!
表app_role_user
具有user_id
,app_role_id
,现在我添加了另一列organization_id
...((将组织视为组,用户可以在其中该组的成员,并且该组的所有者为该用户分配一个角色(不能分配多个角色))。因为现在用户可以在组织之间切换,并且用户可以在不同的组织中扮演不同的角色。
我必须清除:
的路径@if(auth()->user()->can('some route name'))
Html...
@endif
注意::
Auth::user()->current_org->id
显示用户当前所在的组织的ID
以及目前我正在将role_id
,user_id
,organization_id
保存在 app_role_user
表中。< / p>
这是我的AuthServiceProvider
班,
我正在使用Laravel's Gate动态注册权限:
public function boot(GateContract $gate)
{
$this->registerPolicies();
$this->registerAllPermissions($gate);
}
protected function getPermissions() {
return $this->app->make('App\Repositories\PermissionRepository')->withRoles();
}
private function registerAllPermissions($gate) {
if (Schema::hasTable('app_permissions') and Schema::hasTable('users') and Schema::hasTable('app_roles')) {
cache()->forget('app_permissions_with_roles');
foreach ($this->getPermissions() as $permission) {
$gate->define($permission->name, function ($user) use ($permission) {
return $user->hasPermission($permission);
});
}
}
}
这里是PermissionRepository
类:
类PermissionRepository { 受保护的$ model;
public function __construct(AppPermission $model)
{
$this->model = $model;
}
public function all(){
return $this->model->all();
}
public function withRoles(){
$model = $this->model;
$permissions = cache()->remember('app_permissions_with_roles', 1*60*24, function() use($model) {
return $model->with('roles')->get();
});
return $permissions;
}
}
这里是HasRoles
的特征具有hasPermission(AppPermission $permission)
,因为 AuthServiceProvider 类在registerAllPermissions
中需要它。
trait HasRoles {
public function assignRole($role)
{
return $this->roles()->save(
AppRole::whereName($role)->firstOrFail()
);
}
public function hasRole($role)
{
if (is_string($role)) {
return $this->roles->contains('name', $role);
}
return !! $role->intersect($this->roles)->count();
}
public function hasPermission(AppPermission $permission)
{
return $this->hasRole($permission->roles);
}
}
我该怎么办,我已经尝试了许多条件,但没有任何效果。 期待收到您的来信。
感谢您的阅读,请认真注意。
答案 0 :(得分:1)
您可以尝试这样
用户模型
//add organization_id as pivot field
public function roles(){
return $this->belongsToMany(AppRole::class)->withPivot('organization_id');
}
//define a function
public function orgRoles($orgId){
return $this->roles()->wherePivot('organization_id', $orgId)->get();
}
现在具有特征修改hasRole
功能
public function hasRole($role)
{
$orgId = Auth::user()->current_org->id;
if (is_string($role)) {
return $this->orgRoles($orgId)->contains('name', $role);
}
return !! $role->intersect($this->orgRoles($orgId))->count();
}