Одна база пользователей для сайтов

Главные вкладки

Аватар пользователя andriy85if andriy85if 18 декабря 2011 в 2:09

И так, что бы создать несколько сайтов с одной базой данных в Друпал 7:

Сразу скажу, не пугайтесь такой большой инструкции!

1. В админке хостера создаём пользователя баз данных, например databaseuser1.

2. Создаем базу данных для нового сайта base1 и настраиваем к ней доступ юзера databaseuser1

3. Создаем базу данных наших пользователей, которая будет использоваться нашими сайтами, например usersbase и настраиваем к ней доступ пользователя databaseuser1. Позднее нужно будет настроить к ней доступ других пользователей баз данных, которые будут использоваться для главных баз данных других сайтов, которые будут использовать эту базу пользователей.

4. Устанавливаем друпал для сайта site1. При установке на этапе указания базы данных нужно оставить поле «Префиксы таблиц» пустым.

5. После установки заходим в Модули и включаем модуль openid (если собираетесь добавлять к сайту регистрацию по openid)

6. Теперь переносим все нужные нам данные о пользователях и все что с ними связано с базы сайта в отдельную базу. Для этого заходим в PHPMyAdmin через админку вашего хостинга. При входе используем логин и пароль пользователя баз данных сайта site1.

После входа в списке баз данных вы уведите 2 базы: base1 i usersbase. Заходим на базу base1, нажимаем кнопку «экспорт» и экспортируем таблицы базы в 1 файл, который сохраняем на своем компьютере.
Заходим в usersbase. (в нем пока нет никаких таблиц) Нажимаем кнопку «Импорт», указываем на файл с таблицами базы base1 и импортируем все таблицы. После этого с базы usersbase удаляем все ненужные таблицы, которые не относятся к пользователям.

Я решыл оставить следующие таблицы:
authmap
openid_association
openid_nonce
sessions
users
users_roles

Таблицы openid_association и openid_nonce будут только если вы включили модуль openid на сайте перед тем, как экспортировать таблицы с его базы данных.

О значении таблиц можно прочитать на сайте drupaler.ru в разделе «Таблицы»

Теперь назад возвращаемся в базу base1 и удалим там таблицы, которые мы решили перенести на usersbase.

7. Теперь нужно указать сайту site1 где находится таблица пользователей, для этого по фтп заходим в /site1/www/sites/default/ и открываем файл settings.php. В нем ищем строки:

<?php$databases = array (
  'default' => 
  array (
    'default' => 
    array (
      'database' => 'base1',
      'username' => 'databaseuser1',
      'password' => 'пароль пользователя базы',
      'host' => 'адрес хоста сайта',
      'port' => '',
      'driver' => 'mysql',
      'prefix' => '',
    ),
  ),
);
?>

и добавляем строки, чтобы было как ниже:

<?php$databases = array (
  'default' => 
  array (
    'default' => 
    array (
      'database' => 'base1',
      'username' => 'databaseuser1',
      'password' => 'пароль пользователя базы',
      'host' => 'адрес хоста сайта',
      'port' => '',
      'driver' => 'mysql',
      'prefix' => '',
'prefix' => array(
      'default'   => '',
       'authmap'     => 'usersbase.',
       'openid_association'  => 'usersbase.',
       'openid_nonce'      => 'usersbase.',
       'sessions'   => 'usersbase.',
       'users'   => 'usersbase.',
       'users_roles'   => 'usersbase.',
     ),
    ),
  ),
);?>

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

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

У меня пока что работает, если увижу что что-то неправильно, то обязательно сообщу в этой теме.
Не судите сильно, если что не так, только сегодня научился это делать, поэтому если что-то не так то поправим.

Теперь у меня возникает такой вопрос. Как сделать чтобы запись о главном пользователе сайта сохранялась в таблицах базы сайта, а не в таблицах пользователей. То есть нужно, что бы для каждого сайта был свой главный администратор, а не один и тот же, с одним паролем.

И ещё остаётся вопрос про таблицы profile_fields, profile_values, поскольку их нет в Друпал 7. Вот завтра буду искать в этом направлении.

Комментарии

Аватар пользователя andriy85if andriy85if 19 декабря 2011 в 0:37

"Lotar" wrote:
Это таки обучающая статья или вопрос?Если вопрос, то в чем он?

Это больше инструкция, поэтому при создании материала выбрал "тип материала - Предлагаю решение" ... но если имеете желание ответить на вопросы, то они есть в последних 2 предложениях

Аватар пользователя MainVisor MainVisor 3 января 2012 в 17:13

Вот

"andriy85if" wrote:
И ещё остаётся вопрос про таблицы profile_fields, profile_values, поскольку их нет в Друпал 7. Вот завтра буду искать в этом направлении.

Вот здесь посмотри: http://www.drupal.ru/node/73276
Правда, если уже позже, добавить или убрать какое-либо поле в профиле, то придеться менять settings на всех сайтах.

Так что лучше заранее очень хорошо продумать какие поля в профиле нужны

Аватар пользователя MainVisor MainVisor 3 января 2012 в 19:20

Привожу описание таблиц D7:

000_accesslog - Stores site access information for statistics.
000_actions - Stores action information.
000_authmap - Stores distributed authentication mapping.
000_batch - Stores details about batches (processes that run in...
000_block - Stores block settings, such as region and visibility...
000_blocked_ips - Stores blocked IP addresses.
000_block_custom - Stores contents of custom-made blocks.
000_block_node_type - Sets up display criteria for blocks based on content types
000_block_role - Sets up access permissions for blocks based on user roles
000_bueditor_buttons - Stores buttons of 000_bueditor_editors.
000_bueditor_editors - Stores editors and their settings.

000_cache - Generic cache table for caching things not separated out...
000_cache_block - Cache table for the Block module to store already built...
000_cache_bootstrap - Cache table for data required to bootstrap Drupal, may be...
000_cache_field - Generic cache table for caching things not separated out...
000_cache_filter - Cache table for the Filter module to store already...
000_cache_form - Cache table for the form system to store recently built...
000_cache_image - Cache table used to store information about image...
000_cache_menu - Cache table for the menu system to store router...
000_cache_page - Cache table used to store compressed pages for anonymous...
000_cache_path - Cache table for path alias lookup.
000_cache_token - Cache table for token information.
000_cache_update - Cache table for the Update module to store information...
000_cache_views - Generic cache table for caching things not separated out...
000_cache_views_data - Cache table for views to store pre-rendered queries,...
000_captcha_points - This table describes which challenges should be added to...
000_captcha_sessions - Stores the data about CAPTCHA sessions (solution, IP...
000_comment - Stores comments and associated data.
000_ctools_css_cache - A special cache used to store CSS that must be non-volatile.
000_ctools_object_cache - A special cache used to store objects that are being...
000_date_formats - Stores configured date formats.
000_date_format_locale - Stores configured date formats for each locale.
000_date_format_type - Stores configured date format types.
000_field_config -
000_field_config_instance -
000_field_data_body - Data storage for field 2 (body)
000_field_data_comment_body - Data storage for field 1 (comment_body)
000_field_data_field_image - Data storage for field 4 (field_image)
000_field_data_field_mytext - Data storage for field 6 (field_mytext)
000_field_data_field_tags - Data storage for field 3 (field_tags)
000_field_data_taxonomy_forums - Data storage for field 5 (taxonomy_forums)
000_field_revision_body - Revision archive storage for field 2 (body)
000_field_revision_comment_body - Revision archive storage for field 1 (comment_body)
000_field_revision_field_image - Revision archive storage for field 4 (field_image)
000_field_revision_field_mytext - Revision archive storage for field 6 (field_mytext)
000_field_revision_field_tags - Revision archive storage for field 3 (field_tags)
000_field_revision_taxonomy_forums - Revision archive storage for field 5 (taxonomy_forums)
000_file_managed - Stores information for uploaded files.
000_file_usage - Track where a file is used.
000_filter - Table that maps filters (HTML corrector) to text formats ...
000_filter_format - Stores text formats: custom groupings of filters, such as...
000_flood - Flood controls the threshold of events, such as the...
000_forum - Stores the relationship of nodes to forum terms.
000_forum_index - Maintains denormalized information about node/term...
000_history - A record of which users have read which nodes.
000_image_effects - Stores configuration options for image effects.
000_image_styles - Stores configuration options for image styles.
000_languages - List of all available languages in the system.
000_locales_source - List of English source strings.
000_locales_target - Stores translated versions of strings.
000_menu_custom - Holds definitions for top-level custom menus (for example...
000_menu_links - Contains the individual links within a menu.
000_menu_router - Maps paths to various callbacks (access, page and title)
000_node - The base table for nodes.
000_node_access - Identifies which realm/grant pairs a user must possess in...
000_node_comment_statistics - Maintains statistics of node and comments posts to show ...
000_node_counter - Access statistics for nodes.
000_node_revision - Stores information about each saved version of a node.
000_node_type - Stores information about all defined node types.
000_pm_disable - 000_pm_disable holds the list of users that have disabled...
000_pm_index - 000_pm_index holds indexing information about messages...
000_pm_message - 000_pm_messages holds the message information

000_poll - Stores poll-specific information for poll nodes.
000_poll_choice - Stores information about all choices for all polls.
000_poll_vote - Stores per-users votes for each poll.
000_queue - Stores items in queues.
000_registry - Each record is a function, class, or interface name and...
000_registry_file - Files parsed to build the registry.
000_role - Stores user roles.
000_role_permission - Stores the permissions assigned to user roles.
000_search_dataset - Stores items that will be searched.
000_search_index - Stores the search index, associating words, items and...
000_search_node_links - Stores items (like nodes) that link to other nodes, used...
000_search_total - Stores search totals for words.
000_semaphore - Table for holding semaphores, locks, flags, etc. that...
000_sequences - Stores IDs.
000_sessions - Drupal’s session handlers read and write into the...
000_system - A list of all modules, themes, and theme engines that are...
000_taxonomy_index - Maintains denormalized information about node/term...
000_taxonomy_term_data - Stores term information.
000_taxonomy_term_hierarchy - Stores the hierarchical relationship between terms.
000_taxonomy_vocabulary - Stores vocabulary information.
000_tracker_node - Tracks when nodes were last changed or commented on.
000_tracker_user - Tracks when nodes were last changed or commented on, for...
000_url_alias - A list of URL aliases for Drupal paths; a user may visit...
000_users - Stores user data.
000_users_roles - Maps users to roles.
000_variable - Named variable/value pairs created by Drupal core or any...
000_views_display - Stores information about each display attached to a view.
000_views_view - Stores the general data for a view.
000_watchdog - Table that contains logs of all system events.
000_wysiwyg - Stores Wysiwyg profiles.
000_wysiwyg_user - Stores user preferences for wysiwyg profiles.

Аватар пользователя smartdrv smartdrv 6 января 2012 в 12:26

А как происходит общая авторизация, т.е. пользователь авторизовался на одном и перешел на другой оставшись залогиненным???

Аватар пользователя andriy85if andriy85if 6 января 2012 в 12:43

"smartdrv" wrote:
А как происходит общая авторизация, т.е. пользователь авторизовался на одном и перешел на другой оставшись залогиненным???

Именно так. Хотя можно разделять не все поля. Тогда не будет общей авторизации на все сайты сразу. Нужно будет отдельно заходить с одним логином и паролем.

Аватар пользователя gnatovsky.igor gnatovsky.igor 6 января 2012 в 12:56

andriy85if wrote:
"smartdrv" wrote:
А как происходит общая авторизация, т.е. пользователь авторизовался на одном и перешел на другой оставшись залогиненным???

Именно так. Хотя можно разделять не все поля. Тогда не будет общей авторизации на все сайты сразу. Нужно будет отдельно заходить с одним логином и паролем.

А как же cookies, который цепляется к домену?

Аватар пользователя gnatovsky.igor gnatovsky.igor 7 января 2012 в 17:07

MainVisor wrote:
gnatovsky.igor,

Там в settings.php нужно прописать домен, или домены для которых будет передаваться кукис.

Коммент из settings.php вроде как подтверждают Ваши слова:

/**
 * Drupal automatically generates a unique session cookie name for each site
 * based on its full domain name. If you have multiple domains pointing at the
 * same Drupal site, you can either redirect them all to a single domain (see
 * comment in .htaccess), or uncomment the line below and specify their shared
 * base domain. Doing so assures that users remain logged in as they cross
 * between your various domains. Make sure to always start the $cookie_domain
 * with a leading dot, as per RFC 2109.
 */

# $cookie_domain = '.example.com';

Для поддоменов - все понятно: есть поддомены subdomain1.example.com и subdomain2.example.com. Если для кук указать домен '.example.com', то пользователь может оставаться залогиненным на обоих поддоменах.

Но если речь идет про разные доммены (например: example1.com и example2.com). Тут мне логика не понятна. Пользователь логиниться на example1.com, у него в куках записана id сессии. Но, когда он переходит на example2.com, браузер не будет отправлять на этот хост (example2.com) куки, которые принадлежат хосту example1.com. Соответственно сервер не получает id сессии и воспринимает этого пользователя как гостя.
А если есть возможность каким-то образом записать куки сразу к двух хостам (или читать куки другого хоста) - тогда это большая уязвимость, ведь разработчик может прописать (example1.com и google.com).

В общем, буду благодарен, если кто-то пояснит как происходит этот процесс.

MainVisor,
и, каким образом, тогда нужно определить переменную $cookie_domain для двух доменов (я имею в виду синтаксис) - '.example1.com,.exapmle2.com' или как?

Аватар пользователя gnatovsky.igor gnatovsky.igor 8 января 2012 в 5:43

MainVisor wrote:
http://drupal.org/project/sso

либо $cookie_domain = $_SERVER['HTTP_HOST'];

http://drupal.org/project/singlesignon[/quote]

Это как понимать?)) Вы вопрос полностью прочитали? А вопрос, кстати, был реакцией на Ваше прошлое утверждение.

MainVisor,
будьте добры - не умничайте и, если Вы точно знали что имели в виду, когда писали

MainVisor wrote:
Там в settings.php нужно прописать домен, или домены для которых будет передаваться кукис.

то объясните как.
Я не проверял, но моя логика подсказывает, что в данной ситуации $cookie_domain = $_SERVER['HTTP_HOST'] - это бред.

Аватар пользователя MainVisor MainVisor 9 января 2012 в 16:56

По поддоменам вы уже вроде какпоняли,

а по доменам был модуль singlesignon + правка settings, но его выкинули из-за грубых ошибок...