В инфоблоке установлено Расширенное управление правами
Все посетители -> Чтение
Группа Администраторы -> Полный доступ
Струтура:
Раздел
-----> Подраздел
----------> Элемент
-----> Подраздел
Задача ограничить для определенных пользователей доступ к определенным элементам или разделам.
Если выставить ограничение для пользователя входящего либо в Все посетители или Группа Администраторы на раздел (Нет доступа) то пользователь все равно видит данный раздел и может туда попасть.
Использую компонент bitrix:news.list с дополнением, в result_modifier.php используются следующие запросы:
Код |
---|
unset($arResult['SECTION'], $arResult['ITEMS'], $arResult['ELEMENTS']); global $arrFilter, $USER; $arSections = []; $arElements = []; if ($arParams['ADD_SECTIONS_CHAIN'] && !empty($arResult['NAME'])) { $rsNav = CIBlockSection::GetNavChain($arParams['IBLOCK_ID'], $arParams['SECTION_ID']); while ($arNav = $rsNav->GetNext()) { $arResult['SECTION']['PATH'][] = $arNav; } } $arSectionFilter = [ 'ACTIVE' => 'Y', 'GLOBAL_ACTIVE' => 'Y', 'IBLOCK_ID' => $arParams['IBLOCK_ID'], 'CHECK_PERMISSIONS' => 'Y', 'PERMISSIONS_BY' => $USER->GetID() ]; $arElementFilter = [ 'ACTIVE' => 'Y', 'IBLOCK_ID' => $arParams['IBLOCK_ID'], 'CHECK_PERMISSIONS' => 'Y', 'PERMISSIONS_BY' => $USER->GetID() ]; if (empty($arParams['SECTION_ID'])) { $arSectionFilter['DEPTH_LEVEL'] = '1'; } elseif (!empty($arParams['SECTION_ID'])) { $arSectionFilter['SECTION_ID'] = $arParams['SECTION_ID']; $arElementFilter['IBLOCK_SECTION_ID'] = $arParams['SECTION_ID']; } $arSort = [ 'name' => 'asc', 'sort' => 'asc' ]; $arSectionSelect = [ 'ID', 'CODE', 'NAME', 'SORT', 'ACTIVE', 'IBLOCK_ID', 'IBLOCK_SECTION_ID', 'SECTION_PAGE_URL', 'LEFT_MARGIN', 'RIGHT_MARGIN', 'DEPTH_LEVEL', 'TIMESTAMP_X', 'MODIFIED_BY', ]; $arElementSelect = [ 'ID', 'CODE', 'NAME', 'SORT', 'ACTIVE', 'IBLOCK_ID', 'IBLOCK_SECTION_ID', 'LIST_PAGE_URL', 'DETAIL_PAGE_URL', 'TIMESTAMP_X', 'MODIFIED_BY', 'PROPERTY_FILE' ]; $arNavParams = [ 'nPageSize' => 30 ]; $rsSections = CIBlockSection::GetList($arSort, array_merge($arSectionFilter, $arrFilter), false, $arSectionSelect, false); while ($arSection = $rsSections->GetNext()) { $arSection['SECTION'] = 'Y'; $arSections[] = $arSection; } if (!empty($arParams['SECTION_ID'])) { $rsElements = CIBlockElement::GetList($arSort, array_merge($arElementFilter, $arrFilter), false, false, $arElementSelect); while ($arElement = $rsElements->GetNext()) { $arElement['SECTION'] = 'N'; $arElement['DETAIL_PAGE_URL'] = $arElement['PROPERTY_FILE_VALUE']; if (preg_match('/.*\.(pdf)$/iu', $arElement['PROPERTY_FILE_VALUE'])) { $arElement['EXTENSION'] = 'pdf'; } elseif (preg_match('/.*\.(docx|doc)$/iu', $arElement['PROPERTY_FILE_VALUE'])) { $arElement['EXTENSION'] = 'doc'; } elseif (preg_match('/.*\.(xlsx|xls)$/iu', $arElement['PROPERTY_FILE_VALUE'])) { $arElement['EXTENSION'] = 'xls'; } elseif (preg_match('/.*\.(pptx|ppt)$/iu', $arElement['PROPERTY_FILE_VALUE'])) { $arElement['EXTENSION'] = 'ppt'; } elseif (preg_match('/.*\.(html|htm)$/iu', $arElement['PROPERTY_FILE_VALUE'])) { $arElement['EXTENSION'] = 'html'; } elseif (preg_match('/.*\.(jpg|jpeg|png|bmp|gif)$/iu', $arElement['PROPERTY_FILE_VALUE'])) { $arElement['EXTENSION'] = 'image'; } elseif (preg_match('/.*\.(mp4)$/iu', $arElement['PROPERTY_FILE_VALUE'])) { $arElement['EXTENSION'] = 'video'; } elseif (preg_match('/.*\.(msg)$/iu', $arElement['PROPERTY_FILE_VALUE'])) { $arElement['EXTENSION'] = 'mail'; } elseif (preg_match('/.*\.(xml)$/iu', $arElement['PROPERTY_FILE_VALUE'])) { $arElement['EXTENSION'] = 'xml'; } else { $arElement['EXTENSION'] = 'empty'; } $arElements[] = $arElement; } } $arResult['SECTIONS'] = $arSections; $arResult['ELEMENTS'] = $arElements; $arResult['ITEMS'] = array_merge($arSections, $arElements); unset($arSections, $arElements); $arResult['SECTIONS_COUNT'] = count($arResult['SECTIONS']); $arResult['ELEMENTS_COUNT'] = count($arResult['ELEMENTS']); $arResult['TOTAL_COUNT'] = count($arResult['ITEMS']); |
Далее уже в template.php отображаю структуру разделов и входящих в них элементов.
Если Все посетители -> Нет доступа и конкретный пользователь -> Чтение на инфоблок и на определенные разделы выбирать конкретного пользователя и разрешать смотреть, то работает как нужно
Это не решение, так как проблема в 3 тысячах пользователях и 700+ групп
Заметил что общие правила доступа приоритетнее частных правил.
При выборке пробовал использовать:
Код |
---|
CIBlockSectionRights::UserHasRightTo($IBLOCK_ID, $SECTION_ID, $permission); CIBlockElementRights::UserHasRightTo($IBLOCK_ID, $ELEMENT_ID, $permission); |
Но данные методы всегда возвращают 1, не важно стоит частное ограничение или нет, основываются результаты на общих правилах.
Внимание знатоки, вопрос:
Как правильно назначить частные правила доступа на разделы и элементы конкретным пользователям и группам? чтобы данные разделы или не присутствовали в выборке или у данных разделов были пометки о том, что доступ к ним ограничен для данного пользователя или группе.