Как зарегистрировать пользователя в Drupal 6.x без использования API?

У нас должен быть метод "register", доступный через веб-сервис, написанный на java, поэтому у нас нет доступа к Drupal API. Но мы должны иметь возможность успешно зарегистрировать пользователя. Простое добавление пользователя в таблицу пользователей не сделает этого, поскольку вновь созданные пользователи никогда не смогут успешно войти в систему. Опять же, я люблю Drupal API и всегда буду использовать это, так как это "правильный" способ сделать это, но в этом случае у нас просто нет способности сделать это. Любое понимание этой дилеммы?

3 ответа

Решение

Вы хотите пройти через user_save() Функция API, позволяющая получить представление о том, что делает Drupal при создании нового пользователя.

Нет никакого глубокого волшебства в том, что делает Drupal с сохранением данных такого типа: это все в базе данных. Таким образом, хотя использование Drupal API не является идеальным, на самом деле вы имеете дело только с двумя вставками базы данных: {user} вставка таблицы (что вы уже сделали), и {users_roles} вставка стола.

На основании вашей информации, я подозреваю, что отсутствующая ссылка заключается в том, что вы не добавляете строку в {users_roles} таблица для вашего нового пользователя UID. Соответствующая строка в user_save():

db_query('INSERT INTO {users_roles} (uid, rid) VALUES (%d, %d)', $account->uid, $rid);

куда $account->uid UID вновь созданного пользователя, и $rid это идентификатор роли, которую вы хотите дать пользователю. Новому пользователю нужно как минимум authenticated user роль.

Все остальное в user_save() это в основном проверка работоспособности (user_save() обрабатывает обновление пользователя в дополнение к созданию нового) и срабатывание перехвата, о чем вам, скорее всего, не нужно беспокоиться в этом случае.

Хотя метод Марка, вероятно, самый эффективный, его не так просто реализовать или поддерживать. Модули Contrib могут реагировать на то, когда пользователи вставляются в базу данных, и без Drupal вы пропустите это, и вам потребуется реализовать каждый модуль вручную.

Более простым решением было бы создать обратный вызов меню, который можно вызвать из вашей реализации Java. Все, что вам действительно нужно сделать, это опубликовать соответствующую информацию и Drupal, и пусть он позвонит user_save, Это требует дополнительного запроса, но вместо этого вы получаете систему ловушек Drupal и более поддерживаемое решение, которое не сломается, если будут добавлены новые модули.

Чтобы никто не мог создавать пользователей таким образом, вы можете создать настройку для разрешенных IP-адресов и проверить IP-адрес запрашивающего в обратном вызове доступа. Это должно быть самым простым и наиболее безопасным решением, поскольку только сервер (ы) сможет создавать пользователей, а атака методом перебора не сможет быть успешной.

Более простым решением было бы создать пользовательский модуль, который реализует hook_menu() добавить обратный вызов меню, который вызывается из приложения Java.
Проблема этого решения в том, что он небезопасен, так как обратный вызов меню должен быть доступен для анонимных пользователей; это означает, что если кто-то найдет запись обратного вызова в меню, он может создать новых пользователей, минуя проверку, выполненную Drupal, когда пользователи создают новую учетную запись (например, Drupal может проверить, что используемый им адрес электронной почты является тем, который он может использовать). Это та же самая причина, почему вы никогда не должны иметь phpinfo.php файл, который возвращает вывод phpinfo() и это доступно каждому.
Решение состоит в том, чтобы передать в обратный вызов меню созданный вами параметр, который другие пользователи не могут угадать; Drupal 7 делает это, чтобы избежать того, что cron.php вызывается случайными пользователями, что приводит к замедлению работы сайта на Drupal или возникновению других проблем. Drupal имеет функцию, которая возвращает непредсказуемое значение, которое зависит от установки Drupal (drupal_get_token()).

Другой альтернативой является реализация hook_xmlrpc() в пользовательском коде и предоставьте новую функцию RPC, которая принимает параметр для проверки, кто его вызывает, как в предыдущем случае.

Другие вопросы по тегам