如何从Rails控制台注销设计用户?

时间:2015-03-09 04:00:46

标签: ruby-on-rails devise logout

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

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

9 个答案:

答案 0 :(得分:16)

Devise提供辅助方法来完成这些工作。

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

希望这有帮助。

答案 1 :(得分:2)

尝试使用sign_out方法:

sign_out @user 

Devise manual

答案 2 :(得分:0)

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

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

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

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

如果要清除所有用户会话,可以从终端

执行以下操作
rake db:sessions:clear

答案 3 :(得分:0)

要通过 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

答案 4 :(得分:-1)

我不是sign_out @user模式的粉丝,因为至少对于我正在使用的设计版本来说,签署当前用户,无论我传递它的参数如何。如果您在数据库中存储会话,则可以执行以下操作:

@user.update_attributes(current_sign_in_token: "")
TBH我不认为这是最好的方法,但这是我在自己的研究中看到的最佳方式。

答案 5 :(得分:-1)

似乎属性令牌保存会话:

user.tokens = nil
user.save

答案 6 :(得分:-2)

在包含必要的模块之后,您可以使用其他人提到的帮助者:

include Devise::Controllers::SignInOut

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

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

答案 7 :(得分:-2)

我相信您只需更新password_salt,它就会在下次请求时使用户会话无效。

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

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

答案 8 :(得分:-7)

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

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

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