Stop Devise from clearing session

前端 未结 4 1992
孤独总比滥情好
孤独总比滥情好 2020-12-01 12:47

It seems when a user logs out via standard Devise controllers, Devise destroys the entire session store, not just its own data. Is there any way to avoid this behavior? I ha

4条回答
  •  谎友^
    谎友^ (楼主)
    2020-12-01 13:03

    The destroy¹ method of SessionsController contains the following line:

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

    The sign_out_all_scopes² method calls warden.logout without any arguments, and the sign_out³ method calls warden.logout(scope).

    The documentation of the logout⁴ method states:

    # 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)
    

    Conclusion: sign_out should preserve the session when given a specific scope. However, I don't see any way to do that. sign_out_all_scopes is always called first, and will only return false if it couldn't log any user out.

    I recommend either posting a feature request on their issue tracker or developing your own authentication solution. Rails now provides has_secure_password, and these days people seem to be going for the latter in order to avoid running into these problems.


    ¹ Devise::SessionsController#destroy

    ² Devise::Controllers::Helpers#sign_out_all_scopes

    ³ Devise::Controllers::Helpers#sign_out

    ⁴ Warden::Proxy#logout

提交回复
热议问题