Сегодняшняя статья больше для новичков, бывалым будет не интересно, т.к. уже наверняка занимались раскопками на эту тему.

В Битриксе существует возможность настроить политики безопасности у пользовательских групп. Это свод правил, которые дают возможность сделать контроль за безопасностью пользователей каждой группы более жестким, или напротив, более мягким.

Среди правил есть несколько таких, которые относятся к безопасности пароля пользователя, такие как наличие там цифр, букв или спецсимволов. Все эти правила проверяются внутри ядра в момент сохранения пароля. Если вдруг пароль не прошел эти политики, то пароль не будет сохранен и будет выброшено «битриксовое исключение», которое будет содержать текст ошибки.

Но что если вам необходимо проверить пароль без его сохранения в БД? Например для того, чтобы убедиться в его корректности перед передачей в стороннюю БД через API? Или провести проверку безопасности по мере заполнения формы еще до сохранения этой формы?

Достаем политики безопасности

Поскольку политики безопасности объявляются для групп пользователей, то и работают они в том же контексте. Чтобы проверить политики, нужно их сначала получить из БД. Все методы для работы с политиками безопасности находятся в классе \CUser. Для получения политик используется метод \CAllUser::GetGroupPolicy. На вход он принимает одно из трех возможных видов значений:

  • ID пользователя - метод вернет все политики, которые подходят для указанного пользователя
  • Массив с ID групп пользователей - метод вернет наиболее строгие политики безопасности среди указанных групп
  • Пустой массив - метод вернет политики безопасности для группы «Неавторизованные пользователи»

Для примера давайте получим политики безопасности группы 2:

$securityPolicy = \CUser::GetGroupPolicy([2]);
var_dump($securityPolicy);

В результате выборки вы получите массив с описанием всех политик безопасности этой группы

Используем политики для валидации

Валидация производится с помощью метода \CAllUser::CheckPasswordAgainstPolicy. Этот метод уже не статический, поэтому для его использования нам понадобится экземпляр класса \CUser. Метод принимает на вход пароль, подлежащий проверке, а также массив с описанием политик безопасности.

Для примера предположим, что пользователь ввел пароль 11111, попробуем проверить его на политики безопасности для группы 2:

$securityPolicy = \CUser::GetGroupPolicy([2]);
$password = '11111';
$errors = (new \CUser)->CheckPasswordAgainstPolicy($password, $securityPolicy);
var_dump($errors);

Результатом работы метода \CAllUser::CheckPasswordAgainstPolicy будет массив. Если пароль прошел проверку всех политик, то массив будет пустым. Если какие-то из проверок не прошли - то массив будет состоять из строк, описывающих ошибку. В нашем случае результатом будет массив, состоящий из одной ошибки, которая гласит «Пароль должен быть не менее 6 символов длиной.»

Если проверить тот же пароль на более строгую группу, например админскую, то увидим уже другой состав ошибок:

Осталось завернуть это все в библиотеку валидации, использующуюся на проекте, и все будет выглядеть красиво.

Вероятно все это когда-нибудь устареет, в ядре есть класс \Bitrix\Main\Security\CurrentUser, который описывает класс текущего пользователя, а также имеет методы для проверки политик безопасности. Но я думаю, что произойдет это очень нескоро.

А, и еще, не пытайтесь передавать в \CAllUser::CheckPasswordAgainstPolicy вторым аргументом что-то отличное от массива с описанием политик. Валидашка сразу перестанет работать, там внутри нет никакого контроля за корректностью переданного массива.