首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >存在ActiveModel::SecurePassword身份验证方法(Rails 6)

存在ActiveModel::SecurePassword身份验证方法(Rails 6)
EN

Stack Overflow用户
提问于 2020-12-20 19:58:06
回答 1查看 41关注 0票数 0

"authenticate“方法只能在这里找到:https://apidock.com/rails/ActiveModel/SecurePassword/InstanceMethodsOnActivation/authenticate,版本6.0.0是灰色的。因此,这似乎已经过时了。

我在Rails6文档中搜索了authenticate方法,但在https://api.rubyonrails.org/classes/ActiveModel/SecurePassword/ClassMethods.html下没有找到它的记录。然而,在同一页上的代码片段中

代码语言:javascript
复制
# Schema: User(name:string, password_digest:string, recovery_password_digest:string)
class User < ActiveRecord::Base
  has_secure_password
  has_secure_password :recovery_password, validations: false
end

user = User.new(name: 'david', password: '', password_confirmation: 'nomatch')
user.save                                                  # => false, password required
user.password = 'mUc3m00RsqyRe'
user.save                                                  # => false, confirmation doesn't match
user.password_confirmation = 'mUc3m00RsqyRe'
user.save                                                  # => true
user.recovery_password = "42password"
user.recovery_password_digest                              # => "$2a$04$iOfhwahFymCs5weB3BNH/uXkTG65HR.qpW.bNhEjFP3ftli3o5DQC"
user.save                                                  # => true
user.authenticate('notright')                              # => false
user.authenticate('mUc3m00RsqyRe')                         # => user
user.authenticate_recovery_password('42password')          # => user
User.find_by(name: 'david')&.authenticate('notright')      # => false
User.find_by(name: 'david')&.authenticate('mUc3m00RsqyRe') # => user

身份验证方法仍在使用(user.authenticate)。如果我在最新的文档中找不到这个方法,它是从哪里来的?

编辑:关于文档差异的一个相关问题:我能够在rubydocs上找到ActionDispatch::Request::Session,但在api.rubyonrails上找不到。https://www.rubydoc.info/docs/rails/ActionDispatch/Request/Session

https://api.rubyonrails.org/classes/ActionDispatch/Request.html

现在,我不确定在搜索方法时应该在哪里查找。api.rubyonrails不是寻找文档的“权威”地方吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-21 00:06:51

看起来他们忘了在has_secure_password的文档中提到这一点。如果你查看ActiveModel::SecurePasswordsource code。你会发现

代码语言:javascript
复制
        # Returns +self+ if the password is correct, otherwise +false+.
        #
        #   class User < ActiveRecord::Base
        #     has_secure_password validations: false
        #   end
        #
        #   user = User.new(name: 'david', password: 'mUc3m00RsqyRe')
        #   user.save
        #   user.authenticate_password('notright')      # => false
        #   user.authenticate_password('mUc3m00RsqyRe') # => user
        define_method("authenticate_#{attribute}") do |unencrypted_password|
          attribute_digest = public_send("#{attribute}_digest")
          BCrypt::Password.new(attribute_digest).is_password?(unencrypted_password) && self
        end

        alias_method :authenticate, :authenticate_password if attribute == :password

您现在可以根据提供给has_secure_password方法的参数名称将其定义为动态方法。因此,他们以更通用的方式实现了它。为了更友好地向后兼容,我们为authenticate_password实现了别名authenticate,这是最初的实现。

不幸的是,这些动态方法并没有很好地记录在rails API文档中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65379605

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档