public function fire() { $updateRolesOpt = $this->option('update-roles'); $role_permissions = Config::get("acl::config.roles"); $group_resources = Config::get("acl::config.group_resources"); $db_group_resources = GroupResources::all(); $db_role_permissions = RolePermission::all(); if (!$db_role_permissions->count()) { $updateRolesOpt = true; } $group_resources_map = array(); foreach ($db_group_resources as $row) { $group_resources_map[$row->resource] = $row->permission_id; } $this->updateResorces($group_resources_map, $group_resources); $this->updateRolesResources(); if ($updateRolesOpt && count($role_permissions)) { // if there new roles add them, don't delete not list role $roles = Acl::getRoles(); $rolesMap = array(); foreach ($roles as $row) { $rolesMap[$row->name] = $row->role_id; } Acl::runUnguardCallback(function () use($role_permissions, $rolesMap) { foreach ($role_permissions as $role) { $aclRole = new AclRole($role); $role_name = $role['name']; if (isset($rolesMap[$role_name])) { $role['role_id'] = $rolesMap[$role_name]; $aclRole = new AclRole($role); $aclRole->update(); } else { $aclRole = new AclRole($role); $aclRole->add(); } } }); $roles_ids = array_values($rolesMap); if (count($roles_ids)) { UserRole::whereNotIn('role_id', $roles_ids)->delete(); } } }
public static function updateRoleUsers(AclRole $role) { $current_users = UserRole::where('role_id', '=', $role->role_id)->lists('user_id'); $users_to_delete = array_diff($current_users, $role->users->toArray()); if ($users_to_delete) { static::where('role_id', '=', $role->role_id)->whereIn('user_id', $users_to_delete)->delete(); $default_role_id = static::getDefaultRoleId(); if ($default_role_id) { $users_with_roles = static::whereIn('user_id', $users_to_delete)->get()->lists('user_id'); $user_without_roles = array_diff($users_to_delete, $users_with_roles); foreach ($user_without_roles as $user_id) { UserRole::create(['role_id' => $default_role_id, 'user_id' => $user_id]); } } } $users_to_add = array_diff($role->users->toArray(), $current_users); if ($users_to_add) { foreach ($users_to_add as $user_id) { UserRole::create(['role_id' => $role->role_id, 'user_id' => $user_id]); } } }
public function setRoles(array $roleIds) { DB::beginTransaction(); $new_roles = array_diff($roleIds, $this->roles); $exist_roles = array_intersect($roleIds, $this->roles); $deleted_roles = array_diff($this->roles, $roleIds); $new_role_saved = []; $roleProviders = AclFacade::getRoleProvidersTypes(); foreach ($roleProviders as $rp_type) { $rp = AclFacade::getRoleProvider($rp_type); if ($rp->allowUpdateRole()) { $roles_to_delete = $deleted_roles ? $rp->getRoles($deleted_roles)->lists('role_id') : []; if ($roles_to_delete) { UserRole::where('user_id', '=', $this->getKey())->whereIn('role_id', $roles_to_delete)->delete(); } $roles = $new_roles ? $rp->getRoles($new_roles) : []; foreach ($roles as $role) { $role_id = $role->role_id; UserRole::create(['user_id' => $this->user_id, 'role_id' => $role_id]); $new_role_saved[] = $role_id; } } } DB::commit(); $this->roles = array_merge($exist_roles, $new_role_saved); Event::fire('acl_role_updated', array($roleIds)); $cache_prefix = Config::get('acl::cache_key', '_volicon_acl_'); Cache::forever($cache_prefix . '_last_role_update', new MicrotimeDate()); }
public static function updateRole(AclRole $role) { DB::beginTransaction(); $dbRole = static::find($role->role_id); if (!$dbRole) { throw new Exception("Role not found: " . $role->role_id); } if ($dbRole->name !== $role->name && !$dbRole->default) { $dbRole->name = $role->name; $dbRole->save(); } RolePermission::updateRolePermissions($role); UserRole::updateRoleUsers($role); DB::commit(); return $role->role_id; }