【问题标题】:How to auto-generate passwords in Rails Devise?如何在 Rails Devise 中自动生成密码?
【发布时间】:2010-09-10 01:52:55
【问题描述】:

我正在尝试 Devise 如何与我的一个项目一起使用以进行用户身份验证。有一个用户要求,他们的管理员应该能够不时生成一批用户名和用户密码,然后管理员将新的用户名和密码通过电子邮件发送给他的用户。

假设管理员对 MySQL 数据库有直接 SQL 的知识,那么生成的用户名/密码如何被 Devise 识别?谢谢!

【问题讨论】:

    标签: ruby-on-rails devise


    【解决方案1】:

    使用Devise.friendly_token 方法:

    password_length = 6
    password = Devise.friendly_token.first(password_length)
    User.create!(:email => 'someone@something.com', :password => password, :password_confirmation => password)
    

    仅供参考:Devise.friendly_token 返回一个 20 个字符的令牌。在上面的示例中,我们使用 Rails 提供的 String#first 方法删除了生成的令牌的第一个 password_length 字符。

    【讨论】:

      【解决方案2】:

      一种选择是使用 Devise.generate_token。即

      password = User.generate_token('password')
      User.create!(:email => 'someone@something.com', :password => password, :password_confirmation => password)
      

      这个选项在 Devise 中已经有一段时间不可用了。请参考其他答案(friendly_token)。

      【讨论】:

      • 这似乎不再适用于最新版本。我收到 generate_token 的“受保护方法”错误。
      • 你现在想使用Devise.token_generator
      【解决方案3】:

      我正在使用devise-security gem 并且有特定的password_complexity 要求如下:

      config.password_complexity = { digit: 1, lower: 1, upper: 1 }

      如果您使用此代码:Devise.friendly_token.first(password_length) 来生成密码,则不一定能保证获得与您的复杂性相匹配的密码。

      所以我写了一个密码生成器,它会尊重你的password_complexity,并会生成一个随机的投诉密码:

      class PasswordGenerator
        include ActiveModel::Validations
        validates :password, 'devise_security/password_complexity': Devise.password_complexity
        attr_reader :password
      
        def initialize
          @password = Devise.friendly_token.first(Devise.password_length.first) until valid?
        end
      end
      

      您可以按如下方式使用它:

      PasswordGenerator.new.password # "qHc165ku"

      【讨论】:

        【解决方案4】:

        (快速警告:我是 Rails 新手)

        我尝试了 generate_token,但它并没有按照你的想法做(查看文档)

        (我使用的是 rails 3.0.5,并设计了 1.1.7)

        我发现当你这样做时,Devise 会在后台为你生成所有这些东西:

        User.create!(:email => "me@example.com", :password => "password")
        

        Devise 应该为您创建 encrypted_pa​​ssword 和 salt。 (弹出控制台并在那里尝试)

        【讨论】:

        • OP 询问如何为新用户自动“生成”新密码。您在这里所做的是将每个新用户的密码设置为“密码”。当然它在数据库中是加密的,但是你将非常容易受到字典(猜测)攻击。如果您使用令牌(即 generate_token)生成唯一密码,那么您将非常安全,因为这些令牌相当长且复杂(混合字符类型,不基于字典等)。
        • 在我看来,他好像在问他如何输入生成的用户名和密码,并让 Devise 处理它们。他特别问:“生成的用户名/密码怎么能被Devise识别?”我的意思是:我们已经生成了用户名和密码列表,但我不知道如何将该信息插入数据库以便设计人员识别它。我在上面展示的只是所有后台加密等都将由 Devise 处理,无需通过后端数据库。
        • 肯定 建议他们为每个新用户使用“密码”。希望这不是它遇到的方式。这确实是一种非常糟糕的添加新用户的方式。我最初认为“generate_token”是用于生成 encrypted_pa​​ssword,因为 OP 暗示可以直接访问数据库(一起绕过 ActiveRecord)。
        • 同意。不是很清楚。生成令牌方法可能最常用于生成一次性身份验证参数(如邀请)。通过确保它是唯一的,您基本上可以给某人一个像 some.url.com?authentication_token=4hT62wba98s1kfd 这样的 url,并让您的控制器通过查询令牌字符串自动登录。
        猜你喜欢
        • 2011-07-30
        • 1970-01-01
        • 2012-04-29
        • 1970-01-01
        • 2013-10-15
        • 2011-07-15
        • 2012-10-31
        • 1970-01-01
        相关资源
        最近更新 更多