Внешняя аутентификация Drupal 6 - PullRequest
1 голос
/ 06 июля 2011

У меня есть сайт без Drupal, который аутентифицируется с помощью простой пользовательской базы данных MySQL.Я хочу поделиться этой информацией с моим сайтом на Drupal.Поэтому я думаю, что либо:

  • имеет какую-то систему, посредством которой внешняя пользовательская база данных автоматически / регулярно копируется в пользовательскую базу данных Drupal, что дает преимущество в том, что она не мешает системе входа в Drupal;или
  • изменить систему входа в систему Drupal, чтобы она проверяла имя пользователя и пароль по этой внешней базе данных, а затем, предположительно (зная, что Drupal любит хранить вещи локально), создав локальную учетную запись, если это еще не сделано.

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

Так что я думаю, что первое решение предпочтительнее, но тогда, если сценарий настроен только на запускСкажем, один раз в час пользователь не сможет войти на сайт Drupal в течение часа после регистрации на внешнем сайте.Кроме того, это, кажется, очень «не-Drupal» способ ведения дел.

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

Любые предложения ??

РЕДАКТИРОВАТЬ: Iдействительно есть возможность редактировать внешний сайт.Возможно, более простым способом было бы аутентифицировать внешний сайт через пользовательскую базу данных Drupal?Наилучшим способом, по-видимому, является то, что Drupal db заменяет внешний db, поэтому пользователь внешнего сайта db IS Drupal.Или пользователь просто входит через Drupal, и внешний сайт каким-то образом знает, что он это сделал.Любой из них звучит проще?

Ответы [ 4 ]

1 голос
/ 11 июля 2011

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

1 голос
/ 06 июля 2011

Именно поэтому я передал все в OpenID / OAuth. Drupal может быть провайдером OpenID, такие сайты (StackOverflow) допускают множество провайдеров. Поставщик OpenID

Drupal имеет отличную реализацию селектора OpenID: OpenID Selector это то же самое, что вы видите в StackOverflow.

Это, конечно, потребует перехода вашего не-друпального сайта на OpenID / OAuth, что может быть не так просто.

0 голосов
/ 29 июля 2011

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

В hook_form_user_login_alter вы можете искать в массиве $ form ['# validate'] и заменять user_login_authenticate_validateс вашей собственной функцией, которая проверяет внешнюю БД.

Что-то вроде:

function MYMODULE_form_user_login_alter(&$form, $form_state) {
    $array_key = array_search('user_login_authenticate_validate', $form['#validate']);
    if ($array_key === FALSE) {
        $final_validator = array_pop($form['#validate']);
            $form['#validate'][] = 'mymodule_validate';
            $form['#validate'][] = $final_validator;
    }
    else {
        $form['#validate'][$array_key] = 'mymodule_validate';
    }
}

function mymodule_validate($form, &$form_state) {
    if (mymodule_user_exists($form_state['values']['name'])) {
        if (mymodule_check_password($form_state['values']['name'], $form_state['values']['pass'])) {
            user_external_login_register($form_state['values']['name'], 'mymodule');
            user_authenticate_finalize($form_state['values']);
            // maybe sync some data here
        }
    }
    else {
        user_login_authenticate_validate($form, $form_state);
    }
}

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

0 голосов
/ 06 июля 2011

Где я работаю, мы делаем что-то похожее на то, что вы описываете. У нас есть основанная на Java «платформа», которая выступает в качестве основного источника информации об учетной записи. Команда платформы написала REST API для создания учетной записи, аутентификации и обновлений. Мы написали серию пользовательских модулей Drupal для взаимодействия с API платформы во время регистрации, входа в систему и редактирования учетной записи соответственно. Тем не менее, я предупреждаю, что для написания, тестирования и обслуживания требуется много пользовательского кода.

...