Как зарегистрировать пользователя в Drupal 6.x без использования API? - PullRequest
2 голосов
/ 18 августа 2010

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

Ответы [ 3 ]

2 голосов
/ 18 августа 2010

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

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

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

2 голосов
/ 18 августа 2010

Вы захотите пройтись по API-функции user_save(), чтобы получить представление о том, что делает 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() обрабатывает обновление пользователя в дополнение к созданию нового) и срабатывание ловушки, о котором вам, скорее всего, не нужно беспокоиться в этом случае использования. 1022 *

1 голос
/ 18 августа 2010

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

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

...