devise уничтожить всю сессию, но мне нужно сохранить один ключ после выхода из системы [duplicate]

Я попробую объяснение 4-го класса:

Все очень просто. A prototype - пример того, как что-то должно быть построено. Итак:

  • Я function, и я строю новые объекты, похожие на мои prototype
  • Я object, и я был построен с использованием моего __proto__ в качестве примера

доказательство:

function Foo() { }

var bar = new Foo()

// `bar` is constructed from how Foo knows to construct objects
bar.__proto__ === Foo.prototype // => true

// bar is an instance - it does not know how to create objects
bar.prototype // => undefined
21
задан bloudermilk 14 April 2012 в 11:54
поделиться

4 ответа

Метод destroy ¹ SessionsController содержит следующую строку:

signed_out = Devise.sign_out_all_scopes ? sign_out : sign_out(resource_name)

Метод sign_out_all_scopes ² вызывает warden.logout без каких-либо аргументов, а вызов метода sign_out ³ warden.logout(scope).

Документация метода logout ⁴ гласит:

# Logout everyone and clear the session
env['warden'].logout

# Logout the default user but leave the rest of the session alone
env['warden'].logout(:default)

Заключение: sign_out должен сохранять сеанс при задании определенный объем. Однако я не вижу никакого способа сделать это. sign_out_all_scopes всегда всегда называется первым и будет возвращать только false, если он не смог зарегистрировать пользователя.

Я рекомендую либо опубликовать запрос функции на их трекер проблемы или разработка собственного решения для проверки подлинности. Rails теперь предоставляет has_secure_password , и в эти дни люди, похоже, собираются для последнего, чтобы избежать столкновения с этими проблемами.


¹ Devise::SessionsController#destroy

² Devise::Controllers::Helpers#sign_out_all_scopes

³ Devise::Controllers::Helpers#sign_out

Warden::Proxy#logout

18
ответ дан Matheus Moreira 21 August 2018 в 04:06
поделиться

В дополнение к Маттею. Утверждение

signed_out = (Devise.sign_out_all_scopes ? sign_out : sign_out(resource_name))

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

$ git clone git://github.com/plataformatec/devise.git
$ cd devise
$ git branch my_devise
$ git checkout my_devise

Открыть приложение / контроллеры /devise/sessions_controller.rb в вашем редакторе. В методе destroy замените

signed_out = (Devise.sign_out_all_scopes ? sign_out : sign_out(resource_name))

на

signed_out = sign_out(resource_name)

Сохранить и выйти из редактора и сделать

$ git commit -am "remove only warden data from session on logout, preserve other data."

В Gemfile вашего проекта, описать зависимость для разработки, например

gem 'devise', :path => "[YOUR PATH]/devise", :branch => "my_devise"
2
ответ дан Jos 21 August 2018 в 04:06
поделиться

Вы можете просто переопределить SessionController от Devise, как я сделал, чтобы сохранить корзину:

sessions_controller.rb

class SessionsController < Devise::SessionsController

    def destroy
        order_id = session[:order_id] 
        super  
        session[:order_id] = order_id
    end

end

routes.rb

devise_for :users, :controllers => { :sessions => "sessions" }
15
ответ дан manafire 21 August 2018 в 04:06
поделиться
  • 1
    Отличное простое решение! Спасибо за ваш вклад. – bloudermilk 15 May 2012 в 07:22
  • 2
    Простое решение, вы не испортите работу Devise, поэтому риск неожиданного поведения очень низок. – Puce 4 February 2016 в 16:24
  • 3
    Я хотел бы, чтобы это сработало, когда devise использует timeoutable. этот метод никогда не попадает тогда :( – MilesStanfield 20 January 2017 в 18:47

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

config.sign_out_all_scopes = false

В файле devise.rb для получения желаемого поведения.

41
ответ дан Puce 21 August 2018 в 04:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: