我需要在 Devise 的控制台中直接验证用户。我该如何做?

17

我需要从Rails控制台执行以下操作,以进行一些测试和实验:

User.authenticate(username, password)

我正在使用Devise,但我不知道如何做到这一点。

我看到了这个答案

如何在Rails控制台中使用Devise登录用户?

但我需要更简洁和直接的方法。如果必要的话,我只需要一个用盐值对尝试的密码进行哈希并将其与加密后的密码进行比较的算法。

是这样吗?

User.find(1).valid_password?('password123') 

你如何在sessions_controller的create方法(或用户用来登录的任何控制器和操作)中验证用户身份? - tybro0103
我用 User.find_by_username( ).valid_password?() 方法替换了 warden.authenicate! 的代码。 - dan
6
Devise 中有太多的间接层级了,这让曾经很清晰简单的东西变得令人疯狂。 - dan
2个回答

30

概述:

查看这里的 Devise README.

举个例子,这是一个你可以使用的辅助方法来进行测试:

class User
    def self.authenticate(username, password)
        user = User.find_for_authentication(:username => username)
        user.valid_password?(password) ? user : nil
    end
end

测试一下,我得到:

1.9.3p194 :001 > user = User.find(1)
    User Load (0.2ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1
    User id: 1, {...USER DETAILS SHOWN HERE...}
1.9.3p194 :002 > user.valid_password?('is this it?')=> false

在 Rails 控制台中,User.find(1).valid_password?('1') 也可以正常工作:

1.9.3p194 :011 > User.find(1).valid_password?('1')
    User Load (0.3ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1
    => false

作为参考,这是我针对用户模型的Devise设置:

class User < ActiveRecord::Base`

  devise :database_authenticatable, :registerable, :timeoutable, :recoverable, :rememberable, :trackable, :validatable

  {...}

end
像您在评论中所说,Devise没有。请查看/config/initializers/devise.rb中的Devise配置文件。根据您的应用程序配置,您可能还需要查看token.rbsession_store.rb初始化器配置。
编辑:您能否检查您的用户模型以查看是否已正确配置设备?将其与我的devise行进行比较。 :validatable属性可能不存在。
编辑2:如果您希望在控制台之外执行此测试,则添加了帮助程序方法。请检查顶部。
顺便说一句: rails_admin gem非常有用,值得一试!
希望这可以帮助你。

1
这个答案需要注意的一点是 - 如果你在设备配置中启用了“偏执”模式,它似乎会绕过该模式。尽管如此,我还没有找到更好的方法来解决这个问题。 - DaveMongoose
1
我很感激,只是想添加一下评论,以便未来的读者知道 :-) 说句实话,这里的所有内容仍然准确无误! - DaveMongoose
太棒了,感谢确认 @DaveMongoose。我不确定,因为我已经有一段时间没有接触 RoR 了。 - sbolel

5

我认为在不使用任何 gem 的情况下,实现可以变得更简单。至少我们知道电子邮件地址。

电子邮件地址: 'currentuser@email.com' 当前密码:'rubyuser'

user = User.find_by_email('currentuser@email.com')

user.valid_password?('wrong_password')  #returns false
user.valid_password?('rubyuser')    #returns true 

3
我不确定这种方法怎么更简单。它看起来与我之前发布的内容相同,只是没有包装在helper中。此外,这个方法怎么能算是“没有使用任何gem”?你也使用了Devise(对吧?),这是我们都在谈论的唯一gem。哈哈,我意识到自从那时候发布以来已经有一段时间了(而且我也有一段时间没看rails了),所以我感激任何澄清。谢谢! - sbolel
同样适用于Sorcery(希望这能帮助搜索者比我更快地找到)。 - JosephK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接