设计无需密码的身份验证,仅使用用户名

Posted

技术标签:

【中文标题】设计无需密码的身份验证,仅使用用户名【英文标题】:Devise authentication without password, using just username 【发布时间】:2011-06-07 10:52:49 【问题描述】:

是否可以设置Devise 无需密码进行身份验证?

这是一个 Intranet 应用程序。为了连接到它,您首先必须在 *** 上,而且该应用程序只允许查看订单和历史记录的状态,而不能提交任何信息。我想类似于 FedEx 或 UPS 跟踪网站,但允许用户查看整个帐户,并增加了客户从我们这里获得的 *** 盒的安全性。

现在我仍然需要密码,但这是项目中不可协商的要求。客户已经习惯了这种方案,并且不太精通计算机以快速适应变化。

【问题讨论】:

如果太复杂(而且我对 Devise 不太熟悉),您可以将密码设置为隐藏的表单元素。 slhck,我可以。我可以使用一些虚拟密码设置所有帐户并将其提交到隐藏字段中,但这有什么乐趣呢? :-) 【参考方案1】:

如果您还没有从DeviseController 或从DeviseController 继承的控制器(例如Devise::SessionsController)继承,这绝对可以使用sign_in 来完成。然后拨打sign_in(user):

class SignInWithoutPasswordsController < ApplicationController
  include Devise::Controllers::Helpers

  def sign_a_user_in_without_password
    user = User.find(params[:user_id])
    sign_in(user)
  end
end

【讨论】:

【参考方案2】:

在这种情况下,我更喜欢猴子补丁Devise::Strategies::Authenticatable,而不是分叉整个设计存储库以进行一行更改。

Devise::Strategies::Authenticatable.class_eval do
  private
    def valid_password?
      true
    end
end

只需将其放在初始化程序文件中或 devise.rb 初始化程序的末尾(我更喜欢这个,因为它看起来有点像额外的设计配置)。

解释一下,这里修补的valid_password? 通常只返回password.present?,并被Devise::Strategies::DatabaseAuthenticatable 用作在实际检查数据库之前对密码的初始验证。因此,这只会在未提供密码时改变行为。

免责声明:到目前为止,这对我有效,但尚未经过全面测试,因此使用风险自负。

【讨论】:

【参考方案3】:

不太优雅的解决方案(不需要修改设计):使用对所有用户都相同的默认密码

使用before_validation 回调将user.passworduser.password_confirmation 设置为默认值(例如password)。

使用rails generate devise:views 生成设计视图

修改登录表单以使用您的默认密码值添加隐藏密码字段。

正如我所说,它并不优雅,但它应该可以解决问题,而无需深入了解 Devise 的内部结构。


更优雅的解决方案:

在 GitHub 上创建 Devise 项目,并根据您的需要调整 https://github.com/plataformatec/devise/blob/master/lib/devise/strategies/database_authenticatable.rb

然后您可以在 Gemfile 中指定您的 fork。

【讨论】:

大卫实际上在我上面的评论中。我考虑过,但正如你所说 - 不是那么优雅 :-) 无论如何谢谢,至少我得到了验证,因为我不是唯一一个想到这一点的人 :-) 更新了更优雅的解决方案:-) 感谢您为我指明了正确的方向——我什至没有看代码,第一次使用 devise,没想到这么简单。谢谢。 嘿,我也在解决同样的问题,您能否阐明您所做的更改(在 database_authenticable.rb 文件中)以找到更优雅的解决方案 :)

以上是关于设计无需密码的身份验证,仅使用用户名的主要内容,如果未能解决你的问题,请参考以下文章

使用 JWT Lumen 进行身份验证,无需密码

仅针对特定用户的 SSH 身份验证绕过密码身份验证

仅针对经过身份验证的用户的 Django 缓存

仅使用密码而不是 TouchID 的设备上的本地身份验证

无需重定向到 Keycloak 的客户端身份验证

使用 GitLab 令牌无需身份验证即可克隆