【问题标题】:How can I sign out a devise user from the Rails console?如何从 Rails 控制台注销设计用户?
【发布时间】:2015-05-10 04:46:23
【问题描述】:

我的设计用户是“database_authenticatable”和“token_authenticatable”。我已经尝试从控制台中为该用户删除数据库中的“authentication_token”字段,但他们似乎仍然能够使用他们现有的身份验证令牌。删除用户完全可行,但我不想走那么远。

编辑:为清楚起见。我想使用 rails console 注销用户。即运行rails console,然后运行一些命令。

【问题讨论】:

    标签: ruby-on-rails devise logout


    【解决方案1】:

    要在控制台中通过 Devise 进行登录检查:

    $ rails console
    include Warden::Test::Helpers
    def sign_in(resource_or_scope, resource = nil)
      resource ||= resource_or_scope
      scope = Devise::Mapping.find_scope!(resource_or_scope)
      login_as(resource, scope: scope)
    end
    
    def sign_out(resource_or_scope)
      scope = Devise::Mapping.find_scope!(resource_or_scope)
      logout(scope)
    end
    
    @user = User.find(1)
    sign_in @user
    

    然后打开http://127.0.0.1:3000/users/sign_in进行测试,在我的情况下它会绕过这个页面并进入主页!与sign_out相同!

    【讨论】:

      【解决方案2】:

      对于旧版本

      似乎属性令牌保存会话:

      user.tokens = nil
      user.save
      

      【讨论】:

        【解决方案3】:

        Devise 提供了辅助方法来做这些事情:

        user = User.find(params[:id])
        sign_in user
        sign_out user
        

        希望这会有所帮助。

        【讨论】:

        • 由于我使用的是console,我没有这些方法。当我运行 sign_in 命令时,我得到 NoMethodError: undefined method `sign_in' for main:Object
        • 从控制台你可以试试这个:>> ApplicationController.allow_forgery_protection = false>> app.post('/users/sign_in', {"user"=>{"email"=>"login@example.com", "password"=>"password"}})
        • 最好的办法是使用 pry gem。安装后,只需将 line pry 添加到控制器即可访问 sign_out。
        【解决方案4】:

        我相信您可以简单地更新 password_salt,它会在用户下次请求时使用户会话无效。

        user = User.first
        user.update_column(:password_salt, 'reset')    
        

        参考: http://www.jonathanleighton.com/articles/2013/revocable-sessions-with-devise/

        【讨论】:

          【解决方案5】:

          如果您使用的是 Devise,您可以在 rails 控制台 中使用以下内容。如果您每个用户帐户仅使用 1 个会话,这对我来说非常适合我的应用程序。我将会话存储在 redisDB 中。

          user = User.first
          user.update_attributes(unique_session_id: "")
          

          我所要做的就是为该用户清除我的用户 unique_session_id,然后 rails 将用户踢出会话。

          但是对于同一用户帐户的多个会话,这不起作用。

          如果您想清除所有用户会话,您可以从终端执行以下操作

          rake db:sessions:clear
          

          【讨论】:

          • 它为用户提供 ActiveRecord::UnknownAttributeError: unknown attribute 'unique_session_id'。
          【解决方案6】:

          我不喜欢sign_out @user 模式,因为至少对于我正在使用的设计版本,它会注销当前用户,而不管我传递的参数如何。如果您将会话存储在数据库中,那么您可以这样做:

          @user.update_attributes(current_sign_in_token: "")
          

          TBH 我不认为这是最好的方法,但这是我在自己的研究中看到的最好的方法。

          【讨论】:

            【解决方案7】:

            您可以在views->layouts->application.html.erb中创建一个注销链接:-

            <= link_to 'Log Out', destroy_user_session_path, method: :delete %>
            

            它对我有用 - 希望对其他人也有用。

            【讨论】:

            • 问题是从控制台注销
            • 这仅适用于 rails 视图,不适用于 rails 控制台。
            【解决方案8】:

            在包含必要的模块后,您也许可以使用其他人提到的助手:

            include Devise::Controllers::SignInOut

            来源:Module: Devise::Controllers::SignInOut

            还有另一个 SO 问题,有人分享了一个不涉及使用 Devise 助手here 的方法。

            【讨论】:

            • 我收到NameError: uninitialized constant Devise::Controllers::SignInOut
            • 我猜首先需要该库。你可以试试require 'devise' 然后include 吗?不确定需要正确的文件名,所以我会继续探索
            • 还编辑了我的答案以包含指向类似 SO 问题的链接,其中答案标记为正确。它用于登录而不是退出,但如果您想尝试这种方式,应该是一个类似的过程(它会在 /signout 路径上发布一个帖子,并将您的用户信息作为参数)
            • 我在我的 pry 控制台上得到 NameError: undefined local variable or method warden' for main:Object`
            猜你喜欢
            • 2015-09-21
            • 1970-01-01
            • 2021-06-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多