使用用户名设计无需密码的身份validation

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

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

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

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

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

使用rails generate devise:views生成Devise rails generate devise:views

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

正如我所说,不优雅,但它应该做的伎俩,而不需要挖掘Devise内部。


更优雅的解决方案

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

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

在这个例子中,我更喜欢猴子修补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用作密码的初始validation。 因此,这只会在未提供密码时更改行为。

免责声明:这对我来说迄今为止有效,但尚未经过全面测试,因此使用风险由您自行承担。