Ряд аспектов о новых правах доступа уже описывался в презентации Максима Смирнова, в посте Евгения Жукова и в посте Антона Долганина, может кого-то упустил, пардон. Дополню эту информацию типами и способами формирования идентификаторов субъектов ("group codes" в терминологии расширенных прав битрикса):
U1 - Us er (пользователь с ID = 1);
G1 - Group (группа пользователей с ID = 1);
D1 - Department (сотрудники отдела с ID = 1);
DR2 - Department Recursive (сотрудники отдела с ID = 2 и его подотделов);
SG3_A - Sonet Group (админ (владелец) группы соцсети с ID = 3);
SG3_E - Sonet Group (модераторы группы соцсети с ID = 3);
SG3_K - Sonet Group (все члены группы соцсети с ID = 3);
CR - Creator (создатель (автор) элемента);
AU - Authorized Users (все авторизованные пользователи);
Имея эту информацию можно автоматизировать установку прав в своих скриптах, пользуясь методами класса CIBlockElementRights. В предыдущем моём посте был пример кода, как с помощью класса извлекаются текущие права элемента и устанавливаются новые права:
$ob = new CIBlockElementRights($iblockId, $elementId); // создаём объект прав и инициализируем нашим элементом
$ar = $ob->GetRights(); // получаем массив текущих прав элемента
$ob->SetRights($ar); // устанавливаем права элемента
Пример возвращаемого массива прав элемента:
Array
(
[230] => Array // ID набора прав
(
[GROUP_CODE] => G37 // описанный выше группкод
[DO_INHERIT] => Y // производить наследование
[IS_INHERITED] => Y // признак наследованных прав
[OVERWRITED] => 0 // признак перезаписи
[TASK_ID] => 46 // ID уровня доступа
[XML_ID] => // дополнительный произвольный ID, по которому потом, например, можно фильтровать установленные вами права
[ENTITY_TYPE] => iblock // тип сущности
[ENTITY_ID] => 74 // ID сущности
)
)
Пример массива для установки новых прав на объект:
Array
(
[n0] => Array // "n".$i - это важно, по "n" метод определяет, что нужно создать новый набор прав
(
[GROUP_CODE] => CR // группкод "Автор"
[TASK_ID] => 29 // уровень доступа
[XML_ID] => blablabla // наш произвольный ид
)
)
Следует отметить, что если вы хотите не заменить, а дополнить существующие права элемента, то в метод SetRights() нужно передавать массив не только с новыми правами, но и со старыми, иначе метод удалит все права, которых нет в переданном ему массиве. Важный момент - ключи массива старых прав должны быть сохранены, так как они являются идентификаторами существующих прав, осторожней с array_merge(), для склеивания массивов с сохранением ключей юзайте $array1+$array2. Таким образом, чтобы зачистить все права элемента, можно в SetRights() передать просто пустой массив. Другой способ зачистки ненужных существующих прав - это модификация массива существующих прав с добавлением к ненужным правам элемента "DO_CLEAN" => "Y". Хотя первый способ, просто не передавать ставшие ненужными права, проще. Можно не только добавлять новые права и удалять старые, но и изменять существующие. Для этого нужно передать в SetRights() массив с уже существующими идентификаторами, но с новыми параметрами этих прав.
Dumbravanu Vadim, да, спасибо. Когда писал, думал, стоит ли писать, что все пользователи это G2, решил, что по группам пользователей итак понятно, в итоге в задумчивости накосячил тут Исправил.
Добавлю немного полезной на мой взгляд информации по этой теме, так как сегодня долго сам ее искал и опытным путем получилось найти.
Итак, в первую очередь как через API включить в нужном инфоблоке расширенное управление правами:
$ib = new CIBlock;
$arFields["RIGHTS_MODE"] = "E"; // этот параметр с таким значением включает расширенные права
$res = $ib->Update($ID_IBLOCK, $arFields);
Далее для работы не разделами и элементами, а со всем инфоблоком используем CIBlockRights
Вот так будет выглядеть код по добавлению новых прав конкретного пользователя для всего инфоблока
$ob = new CIBlockRights($ID_IBLOCK, 0);
$ar = $ob->GetRights();
// дополняем в массив новый элемент
$ar["n0"] = array(
"GROUP_CODE" =>"U".$ID_USER,
"TASK_ID" => 43, // ID уровня доступа
);
$ob->SetRights($ar);
Не нашёл в указанных статьях информации о том, как найти TASK_ID. Обычно везде фигурируют буквенные коды ("W","R" и т.д.) Просто положу это здесь: $task_id = \CIBlockRights::LetterToTask('W'); - описания этого класса, увы, нет на api_help, но у него вполне читабельные исходники.
Каким образом можно переопределить права для элемента ИБ? Т.е., например, даны права на чтение на уровне ИБ группе ID=11, мне нужно спрятать элемент от всех кроме некоторых пользователей. Пытаюсь переопределить права вот так
function chmodSectionAccess($bid, $sid, $group_code, $tid, $mod, $overwrite = 0)
{
$bid = intval($bid); // идентификатор инфоблока
$sid = intval($sid); // идентификатор раздела
$group_code = trim($group_code); // группкод
$tid = intval($tid); // идентификатор уровня доступа
$mod = ($mod === "Y"); // дать/убрать (Y|N) права на раздел
if ($bid > 0 && $sid > 0 && strlen($group_code) > 0 && $tid > 0)
{
// получаем текущий массив прав
$ob = new CIBlockElementRights($bid, $sid);
$ar = $ob->GetRights();
pp($ar);die();
if ($mod)
{
// дополняем в массив новый элемент
$ar["n0"] = array("GROUP_CODE" => $group_code, "TASK_ID" => $tid, "XML_ID" => "API", "OVERWRITED" => intval($overwrite));
}
else
{
// находим совпадающее со входными данными и исключаем из массива
foreach ($ar as $i => $r)
{
if ($r["GROUP_CODE"] === $group_code && $r["TASK_ID"] === $tid)
unset($ar[$i]);
}
}
// записываем новые права из массива (другие не наследуемые будут удалены)
$ob->SetRights($ar);
return TRUE;
}
return FALSE;
}
//устанавливаем права "Нет доступа" на элемент
chmodSectionAccess($arParams["IBLOCK_ID"], $ELEMENT_ID, 'G11', 38, "Y", 1);
Битрикс 24. Задача: после изменения состояния элемента инфоблока необходимо программно ограничить права на его изменение для определенной группы пользователей. Попытка воспользоваться предлагаемой здесь техникой не срабатывает:
В документации класс CIBlockElementRights не описан. LiveAPI сообщает, что метод CIBlockElementRights::SetRights() не обнаружен. CIBlockElementRights::GetRights() прекрасно работает.
Может кто подскажет, как сейчас можно программно изменить права на элемент инфоблока? Или надо просто погружаться в изучение iblock_element_edit.php?
$res = (new CIBlockElement)->Update($ID, $arFields, $WF=="Y", true, true);
Изменение прав доступа к элементу выполняется с использованием метода Update класса CIBlockElement, которому передается массив "RIGHTS". Смотрите комментарии к описанию https://dev.1c-bitrix.ru/api_help/iblo...update.php():
$res = (new CIBlockElement)->Update($ID, $arFields); // изменяет только права на доступ к элементу. Добавляет два новых разрешения. Новые разрешения будут преопределять ранее установленные разрешения для соответствующих групп.
Группы на сайте создаются не только сотрудниками «1С-Битрикс», но и партнерами компании. Поэтому мнения участников групп могут не совпадать с позицией компании «1С-Битрикс».