加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – Ruby on Rails / Devise – 需要密码才能更改

发布时间:2020-12-16 19:13:59 所属栏目:百科 来源:网络整理
导读:对于所有弹珠来说,如果我能解决这个问题,那么我就完成了一个项目. 无论如何,我使用Ruby on Rails 3和Devise进行用户身份验证.您可能知道,默认情况下,在用户admin / edit中,如果用户提供新密码,则必须在current_password字段中输入其当前密码.有关如何禁用cur
对于所有弹珠来说,如果我能解决这个问题,那么我就完成了一个项目.

无论如何,我使用Ruby on Rails 3和Devise进行用户身份验证.您可能知道,默认情况下,在用户admin / edit中,如果用户提供新密码,则必须在current_password字段中输入其当前密码.有关如何禁用current_password的TON信息,以便用户可以自由更改和保存.

但是,我发现相反的情况很少:要求更多字段的当前密码…在我的情况下,电子邮件字段.并且只在更改电子邮件地址时才需要当前密码,而不是在它保持不变的情况下.目前,用户可以在不提供当前密码的情况下自由更改电子邮件,出于安全考虑,我不希望这样.

通过Devise wiki查看后,我确实找到了this page,我想我可以反转这段代码来完成这个解决方案.我设法在我的user.rb模型中完成了这一点(我删除了这个帖子的不必要的逻辑)….

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :token_authenticatable,:confirmable,:lockable and :timeoutable
  devise :database_authenticatable,:registerable,:recoverable,:rememberable,:trackable,:validatable

  # Setup accessible (or protected) attributes for your model
  attr_accessible :name,:email,:password,:password_confirmation,:avatar,:remember_me,:agree
  attr_accessor :accessible,:agree,:signed_in
  attr_readonly :name

  # Validation
  validates :name,:presence => TRUE,:uniqueness => TRUE,:length => { :within => 4..20 }
  validates :agree,:term_agreement => TRUE,:unless => :signed_in
  validates_attachment_size :avatar,:less_than => 1.megabyte
  validates_attachment_content_type :avatar,:content_type => ['image/jpeg','image/png','image/gif']
  validates :current_password,:if => :password_required?

  protected

  def password_required?
    email_changed?
  end

end

它“几乎”有效.如果我保存用户配置文件而不更改任何内容,或更改其他非密码必填字段(如用户头像),配置文件保存正常,无需密码.到现在为止还挺好.

如果我更改了电子邮件地址,则会触发验证….但是会发生的情况是current_password和密码(对于新密码)字段都会根据需要触发.如果我填写所有三个密码(密码,密码_确认,current_password)只是为了它的地狱,它将不会采取,只是再次给出验证错误.

基本上,如果更改了电子邮件地址,则只需要current_password.我如何在我的代码中完成这项工作?

>更新*******

我检查了我的日志以响应bowsersenior的以下建议,并在我尝试保存和更新电子邮件时看到以下行:

User Load (0.2ms)  SELECT `users`.`id` FROM `users` WHERE (LOWER(`users`.`email`) = LOWER('newaddress@changed.com')) AND (`users`.id <> 1) LIMIT 1
  User Load (0.2ms)  SELECT `users`.`id` FROM `users` WHERE (`users`.`name` = BINARY 'Administrator') AND (`users`.id <> 1) LIMIT 1
  SQL (0.1ms)  ROLLBACK

我想知道’ROLLBACK’是否与最终问题有关?

解决方法

尝试一下:
validates :current_password,:if => :email_changed?

我强烈建议你留下password_required?单独.这可能导致安全性和不稳定行为的错误.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读