Доброе утро, ЛОР.
Задача: Плагин авторизации для Moodle. Плагин проверяет на внешней системе идентификационные данные пользователя. Если результат true, авторизует пользователя, иначе отклоняет авторизацию.
Особенность: Moodle работает только с локальными профилями. Если авторизация разрешена, а локальный профиль отсутствует, пользователя потребуется создать.
В начале был такой код:
public function user_login($username, $password) {
if (!auth_billing::check_user($username, $password)) {
return false;
}
if (!$user = get_complete_user_data('email', $username)) {
if (!auth_billing::create_user($username)) {
return false;
}
$user = get_complete_user_data('email', $username);
}
complete_user_login($user);
self::redirect();
}
Авторизация происходит по адресу электронной почты и паролю пользователя. На версии Moodle 3.5+ код работает, как и ожидается. На старых версиях Moodle всплыл нюанс: В функцию передаётся адрес эл. почты только тогда, когда локальный профиль отсутствует. В остальных случаях, передаётся логин существующего пользователя.
Функция была переписана таким образом:
public function user_login($username, $password) {
if (!validate_email($username)) {
if (!$user = get_complete_user_data('username', $username)) {
return false;
}
if (!auth_billing::check_user($user->email, $password)) {
return false;
}
} else {
if (!auth_billing::check_user($username, $password)) {
return false;
}
if (!$user = get_complete_user_data('email', $username)) {
if (!auth_billing::create_user($username)) {
return false;
}
$user = get_complete_user_data('email', $username);
}
}
complete_user_login($user);
self::redirect();
}
Вопрос: Это работает и выполняет возложенную задачу. Не устраивает количество условий и уровень вложенности. Существуют способы оптимизации этого кода?