2013-06-06 2 views
8

У меня есть приложение для рельсов 4, где я использую устройство для аутентификации, и он отлично работает. Моя единственная проблема заключается в том, что он теряет сеанс пользователя после того, как я его разворачиваю на сервере, и пользователи должны снова войти в систему.Утилита теряет сеанс после развертывания

Если я просто перезагружаю nginx/пассажира (который я использую для своего приложения), он не теряет его. Когда я развертываю свое приложение, я теряю его. Для развертывания я также автоматически уничтожаю всю базу данных, и мой сценарий развертывания запускает файл семян, который также генерирует пользователей.

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

Так что это проблема из-за пересадки или я должен проверить что-то еще? Я вижу, что зашифрованный пароль меняется каждый раз, когда я запускаю действие wipe out/seed, связано ли это с потерей пользовательского сеанса?

ответ

4

Причина такого поведения заключается в следующем:

Everytime какой-то пользователь изменяет свой пароль, изобрести автоматически signs_out его.

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

Мне удалось обойти это поведение, специально настроив зашифрованный пароль в файле seeds.rb и минуя проверку.

7

Вы никогда не должны уничтожать базу данных во время развертывания. Представьте, что ваше приложение запущено, и у вас есть сотни пользователей. Теперь вы внесете некоторые изменения в код и выполните развертывание. POOF все ваши данные и пользователи ушли! Конечно, это не то, что вы хотите.

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

  • Вы посевные пользователей с одинаковым ID? Если идентификатор пользователя изменяется при повторном посещении, это приведет к выходу пользователей из системы.

  • Вы храните сеансы в базе данных с помощью config.session_store :active_record_store вместо использования файлов cookie? В этом случае уничтожение базы данных удалит таблицу сеансов и выведет всех пользователей

  • Rails 4 по умолчанию использует зашифрованный магазин cookie. Убедитесь, вы уверены, что вы не меняете config.secret_token при передислокации вашего приложения, в случае его получения загружаются из базы данных

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

+0

Наше приложение находится в разработке, когда оно будет в производстве, мы не будем этого делать, мы просто добавим миграции (я написал его в своем сообщении). Мы слишком много меняем/тестируем, поэтому это необходимо на этом раннем этапе. Идентификатор пользователя определен в семени, поэтому пользователи имеют одинаковый идентификатор каждый раз, когда мы повторно загружаем базу данных. Мы не меняем secret_token, и мы используем настройку по умолчанию. Так почему это происходит? – JohnDel

+0

@JohnDel как насчет двух других предложений? таблица сеансов и идентификатор пользователя? – Subhas

+0

Мы используем: cookie_store как session_store (внутри инициализатора), и пользователи имеют одинаковые идентификаторы до и после вытирания/повторения. – JohnDel

2

Если я просто перезагружаю nginx/пассажира (который я использую для своего приложения ), он не теряет его. Когда я развертываю свое приложение, я теряю его. Для развертывания я также автоматически уничтожаю всю базу данных, а мой сценарий развертывания запускает файл семян, который также генерирует пользователей .

Если вы создаете новых пользователей, старые потеряют свои сеансы.

Это потому, что значения новых пользователей будут разными. Например, у них может не быть установленного набора токенов, или если session_id использует значения user.created_at или user.token_generated_at, они будут отличаться при каждом сбросе и воссоздании базы данных.

+0

«Если вы создадите новых пользователей, старые потеряют свои сеансы». Зачем? Разве сеансы не хранятся в браузере? Я не храню их в базе данных. – JohnDel

+0

Сессия специфична для пользователя. Если вы создадите нового пользователя, это будет другой пользователь, даже жесткий адрес электронной почты может быть одинаковым. –

+0

Все строки пользователя одинаковы (id, email и т. Д.). Единственное, что меняется в базе данных, это зашифрованный пароль (хотя я использую тот же пароль, его шифрует в новой строке). Зачем? Я храню сессию в cookie. – JohnDel

Смежные вопросы