/** * Sync permissions với actions được 'định nghĩa' trong các resources model * * @return \Illuminate\Http\JsonResponse */ public function sync() { // actions định nghĩa trong các model $resource_actions = app('access-control')->getResourceActions(); $model_actions = []; foreach ($resource_actions as $resource => $actions) { $model_actions = array_merge($model_actions, array_map(function ($action) use($resource) { return "{$resource}.{$action}"; }, array_keys($actions))); } // actions đã lưu trên DB (permissions table) $db_actions = array_map(function ($permission) { return "{$permission['resource']}.{$permission['action']}"; }, Permission::all()->toArray()); // có trong DB, nhưng không có trong model ===> remove $remove = array_diff($db_actions, $model_actions); foreach ($remove as $action) { list($resource, $action_name) = explode('.', $action); if ($permission = Permission::whereResource($resource)->whereAction($action_name)->first()) { // Permission model sẽ tự động xóa liên kết với roles $permission->delete(); } } // có định nghĩa trong model, nhưng chưa lưu trong DB ===> insert $insert = array_diff($model_actions, $db_actions); if ($insert) { $permissions = array_map(function ($action) { list($resource, $action_name) = explode('.', $action); return ['resource' => $resource, 'action' => $action_name]; }, $insert); Permission::insert($permissions); } return response()->json(['type' => 'success', 'content' => trans('access-control::permission.sync_success')]); }
/** * Lấy tất cả permisions của các role của user * - Đối với từng role, permissions bao gồm của nó và của tất cả role ưcùng role_groupơ nhưng [level < hơn nó] * * @return \Illuminate\Database\Eloquent\Builder */ public function permissions() { // Role IDs tất cả roles attach trực tiếp với User + 'Roles cấp dưới của các roles đó' $role_ids = []; foreach ($this->getRoles() as $role) { /** @var \Minhbang\AccessControl\Models\Role $role */ $role_ids = array_merge($role_ids, $role->getInferiorIds(true)); } $role_ids = $role_ids ?: [-1]; return Permission::select('permissions.*')->join('permission_role', 'permission_role.permission_id', '=', 'permissions.id')->join('roles', 'roles.id', '=', 'permission_role.role_id')->whereIn('roles.id', $role_ids)->groupBy('permissions.id'); }
/** * @param \Minhbang\AccessControl\Models\Role $role * @param string $ids * * @return \Illuminate\Http\JsonResponse */ public function attachPermission(Role $role, $ids) { if ($ids = explode(',', trim($ids))) { $all_ids = Permission::all()->pluck('id')->all(); // Chỉ lấy ids là permissions ID $ids = array_filter($ids, function ($id) use($all_ids) { return in_array($id, $all_ids); }); // Loại bỏ các permissions đã attach vào $role này rồi $ids = array_diff($ids, $role->permissions->pluck('id')->all()); if ($ids) { $role->permissions()->attach($ids); } } return response()->json(['type' => 'success', 'content' => trans('access-control::role.attach_permission_success')]); }