设计无需密码的身份验证,仅使用用户名
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.password
和user.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 文件中)以找到更优雅的解决方案 :)以上是关于设计无需密码的身份验证,仅使用用户名的主要内容,如果未能解决你的问题,请参考以下文章