Laravel permissions can () function | авторизация

У меня есть 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') - это имя маршрута. Он работает нормально.

Where i am stuck !!!

В таблице app_role_user были user_id, app_role_id, теперь я добавил еще один столбец organization_id ... (Рассматривайте организации как группы, в которых пользователь может быть членом этих групп, а владелец группы назначает одну роль (не может назначить несколько ролей) этому пользователю.). Потому что теперь пользователь может переключаться между организацией, а пользователь может иметь разные роли в разных организациях.

Я должен освободить путь для:

@if(auth()->user()->can('some route name'))
    Html...
@endif

Note : : Auth::user()->current_org->id show the id of the organization in which the user is in right now

В настоящее время я сохраняю role_id, user_id, organization_idвapp_role_userТаблица.

Вот мой класс 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 { защищенная модель $;

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

Что мне делать? Я перепробовал много условий, но ничего не помогло. Будем рады услышать от вас, ребята.

Спасибо за прочтение. Пожалуйста, уделите серьезное внимание.

1
0
1 124
1

Ответы 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();
}

Другие вопросы по теме