Система аутентификации с несколькими базами данных, где я должен хранить сеансы с помощью Zend Framework?

Я пишу приложение ERM с использованием Zend Framework, в котором учетные записи пользователей создаются под основной учетной записью компании, что позволяет мне ограничивать количество учетных записей пользователей для компании на основе лицензии, за которую компания заплатила. У каждой учетной записи компании есть собственная база данных (с идентичной структурой для других компаний) на моем сервере для хранения данных, относящихся к этой компании. Название каждой базы данных компаний хранится в моей «внутренней» базе данных вместе с остальной информацией об учетной записи компании и лицензионным ключом. Система аутентификации работает следующим образом:

  1. Новый пользователь (который никогда раньше не использовал приложение) попадает на страницу индекса и приветствуется одним текстовым полем для «Номер счета компании».
  2. После нажатия кнопки «Отправить» следующим шагом аутентификации будет ввод имени пользователя и пароля. Когда пользователь отправляет эту форму, все три части информации (номер учетной записи, имя пользователя и пароль) отправляются обработчику аутентификации моего приложения.
  3. Моя "внутренняя" база данных, в которой хранятся учетные записи компаний, сначала запрашивается, чтобы узнать, существует ли учетная запись, введенная пользователем. Если это так, возвращается столбец company_db_name и устанавливается соединение, которое сохраняется в Zend_Registry. В противном случае аутентификация не удалась.
  4. Если учетная запись компании существует, то в базу данных, которая была возвращена, затем запрашивается ее users таблица для указанного имени пользователя и хэша пароля, который либо возвращает успешный экземпляр MyApp_Auth, либо false, если учетные данные были неправильными.

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

  1. Переместите мою таблицу хранения сеансов из базы данных клиента в мою «внутреннюю» базу данных, которая имеет соединение, как только приложение запускается.
  2. Добавьте в таблицу столбец «Номер счета компании» и проиндексируйте этот столбец.
  3. Когда пользователь попадает на страницу приложения index, можно запросить внутреннюю базу данных для sessionid текущего пользовательского агента. Если он найден, то верните всю необходимую информацию, то есть название базы данных компании, чтобы установить соединение, и информацию о пользователе, с которой будет построена модель.

У меня есть пара вопросов относительно этого подхода:

Вопрос 1. Есть ли риск хранить всю информацию о сеансе для каждого пользователя моего приложения в одной таблице серверной базы данных? Я мыслю многотысячными пользователями.

Вопрос 2: меня беспокоит, что новый пользователь может посетить страницу индекса и совершенно случайно (понимая, что это очень низкая вероятность, но все же возможен) имеет тот же session_id, что и существующий сеанс в серверной базе данных . Является ли это серьезной проблемой, и если да, то можно ли ее уменьшить?

Вопрос 3. Есть ли лучший способ или вы порекомендуете другой способ достижения требуемых мной функций?

Спасибо за уделенное время!


person John Hall    schedule 04.09.2012    source источник


Ответы (1)


Чтобы ответить на 3 ваших вопроса:

Ответ 1. Это не риск как таковой для хранения информации о сеансе каждого пользователя, если вы удалите ее по истечении срока действия сеанса. Проблема здесь в «масштабируемости», какой подход вы используете? Достаточно ли масштабируема? Какая скорость записи / чтения? MySQL - это «структурированный» подход, как и MSSQL. Какое время обработки вы ищете? Сколько информации хранится? Что такое архитектурные этюды. Достаточно ли это выполнимо для вашего клиента?

Ответ 2. В идеале session_id не должен совпадать, так что это не должно вас беспокоить.

Ответ 3. Вам нужен подход NoSQL (не только SQL, но даже больше). Прочтите это

Учитывая МАССИВНОСТЬ ваших данных, я настоятельно рекомендую вам использовать HBASE (использует Hadoop, легко для multi cluster) или CouchDB, или если вы поклонник Amazon DynamoDB.

Вопросы? :)

РЕДАКТИРОВАТЬ: только что понял, что вы используете Zend Framework. В этом случае вы также можете использовать MongoDB и использовать Библиотека Shanty Mongo.

person Karma    schedule 04.09.2012
comment
Спасибо за ваш вклад! В настоящее время я не могу позволить себе реструктурировать свой уровень данных с использованием MongoDB, хотя я могу рассмотреть это в будущем. Природа приложения требует особенно подробных функций отчетности, для которых, как мне кажется, MongoDB может быть не лучшим вариантом. Что касается вопроса № 2, я понимаю, что вероятность этого чрезвычайно мала, однако вероятность, несомненно, есть даже с добавлением дополнительной «случайности» к генерации PHP session_id. У меня есть идея устранить (опять же, невероятно малую) вероятность дублирования идентификаторов с помощью сравнения IP. - person John Hall; 04.09.2012
comment
Итак, я думаю, у вас больше нет запросов? - person Karma; 04.09.2012