Сегодняшняя статья больше для новичков, бывалым будет не интересно, т.к. уже наверняка занимались раскопками на эту тему.
В Битриксе существует возможность настроить политики безопасности у пользовательских групп. Это свод правил, которые дают возможность сделать контроль за безопасностью пользователей каждой группы более жестким, или напротив, более мягким.
Среди правил есть несколько таких, которые относятся к безопасности пароля пользователя, такие как наличие там цифр, букв или спецсимволов. Все эти правила проверяются внутри ядра в момент сохранения пароля. Если вдруг пароль не прошел эти политики, то пароль не будет сохранен и будет выброшено «битриксовое исключение», которое будет содержать текст ошибки.
Но что если вам необходимо проверить пароль без его сохранения в БД? Например для того, чтобы убедиться в его корректности перед передачей в стороннюю БД через API? Или провести проверку безопасности по мере заполнения формы еще до сохранения этой формы?
Достаем политики безопасности
Поскольку политики безопасности объявляются для групп пользователей, то и работают они в том же контексте. Чтобы проверить политики, нужно их сначала получить из БД. Все методы для работы с политиками безопасности находятся в классе \CUser. Для получения политик используется метод \CAllUser::GetGroupPolicy. На вход он принимает одно из трех возможных видов значений:
- ID пользователя — метод вернет все политики, которые подходят для указанного пользователя
- Массив с ID групп пользователей — метод вернет наиболее строгие политики безопасности среди указанных групп
- Пустой массив — метод вернет политики безопасности для группы «Неавторизованные пользователи»
Для примера давайте получим политики безопасности группы 2:
1 2 |
$securityPolicy = \CUser::GetGroupPolicy([2]); var_dump($securityPolicy); |
В результате выборки вы получите массив с описанием всех политик безопасности этой группы
Используем политики для валидации
Валидация производится с помощью метода \CAllUser::CheckPasswordAgainstPolicy. Этот метод уже не статический, поэтому для его использования нам понадобится экземпляр класса \CUser. Метод принимает на вход пароль, подлежащий проверке, а также массив с описанием политик безопасности.
Для примера предположим, что пользователь ввел пароль 11111, попробуем проверить его на политики безопасности для группы 2:
1 2 3 4 |
$securityPolicy = \CUser::GetGroupPolicy([2]); $password = '11111'; $errors = (new \CUser)->CheckPasswordAgainstPolicy($password, $securityPolicy); var_dump($errors); |
Результатом работы метода \CAllUser::CheckPasswordAgainstPolicy будет массив. Если пароль прошел проверку всех политик, то массив будет пустым. Если какие-то из проверок не прошли — то массив будет состоять из строк, описывающих ошибку. В нашем случае результатом будет массив, состоящий из одной ошибки, которая гласит «Пароль должен быть не менее 6 символов длиной.»
Если проверить тот же пароль на более строгую группу, например админскую, то увидим уже другой состав ошибок:
Осталось завернуть это все в библиотеку валидации, использующуюся на проекте, и все будет выглядеть красиво.
Вероятно все это когда-нибудь устареет, в ядре есть класс \Bitrix\Main\Security\CurrentUser, который описывает класс текущего пользователя, а также имеет методы для проверки политик безопасности. Но я думаю, что произойдет это очень нескоро.
А, и еще, не пытайтесь передавать в \CAllUser::CheckPasswordAgainstPolicy вторым аргументом что-то отличное от массива с описанием политик. Валидашка сразу перестанет работать, там внутри нет никакого контроля за корректностью переданного массива.