Я пишу приложение ERM с использованием Zend Framework, в котором учетные записи пользователей создаются под основной учетной записью компании, что позволяет мне ограничивать количество учетных записей пользователей для компании на основе лицензии, за которую компания заплатила. У каждой учетной записи компании есть собственная база данных (с идентичной структурой для других компаний) на моем сервере для хранения данных, относящихся к этой компании. Название каждой базы данных компаний хранится в моей «внутренней» базе данных вместе с остальной информацией об учетной записи компании и лицензионным ключом. Система аутентификации работает следующим образом:
- Новый пользователь (который никогда раньше не использовал приложение) попадает на страницу индекса и приветствуется одним текстовым полем для «Номер счета компании».
- После нажатия кнопки «Отправить» следующим шагом аутентификации будет ввод имени пользователя и пароля. Когда пользователь отправляет эту форму, все три части информации (номер учетной записи, имя пользователя и пароль) отправляются обработчику аутентификации моего приложения.
- Моя "внутренняя" база данных, в которой хранятся учетные записи компаний, сначала запрашивается, чтобы узнать, существует ли учетная запись, введенная пользователем. Если это так, возвращается столбец
company_db_name
и устанавливается соединение, которое сохраняется вZend_Registry
. В противном случае аутентификация не удалась. - Если учетная запись компании существует, то в базу данных, которая была возвращена, затем запрашивается ее
users
таблица для указанного имени пользователя и хэша пароля, который либо возвращает успешный экземплярMyApp_Auth
, либоfalse
, если учетные данные были неправильными.
Сначала я планировал хранить данные сеанса пользователя в базе данных отдельных компаний, однако столкнулся с проблемой отсутствия подключения к этой базе данных при первом переходе на страницу индекса приложения. Я запланировал обходной путь следующим образом:
- Переместите мою таблицу хранения сеансов из базы данных клиента в мою «внутреннюю» базу данных, которая имеет соединение, как только приложение запускается.
- Добавьте в таблицу столбец «Номер счета компании» и проиндексируйте этот столбец.
- Когда пользователь попадает на страницу приложения
index
, можно запросить внутреннюю базу данных дляsessionid
текущего пользовательского агента. Если он найден, то верните всю необходимую информацию, то есть название базы данных компании, чтобы установить соединение, и информацию о пользователе, с которой будет построена модель.
У меня есть пара вопросов относительно этого подхода:
Вопрос 1. Есть ли риск хранить всю информацию о сеансе для каждого пользователя моего приложения в одной таблице серверной базы данных? Я мыслю многотысячными пользователями.
Вопрос 2: меня беспокоит, что новый пользователь может посетить страницу индекса и совершенно случайно (понимая, что это очень низкая вероятность, но все же возможен) имеет тот же session_id, что и существующий сеанс в серверной базе данных . Является ли это серьезной проблемой, и если да, то можно ли ее уменьшить?
Вопрос 3. Есть ли лучший способ или вы порекомендуете другой способ достижения требуемых мной функций?
Спасибо за уделенное время!