我们正在尝试使用Devise Security Extension gem来使用:password_archivable功能,以防止用户重复使用旧密码。每当我们尝试在网站上更改用户密码时,我们都会收到批量分配错误。
我们模型的一部分:
class User < Person
rolify
devise :database_authenticatable, #...
:password_archivable
#attr_accessible :encrypted_password, :password_salt
...
end
我们控制器的一部分:
class HealthPromotersController < ApplicationController
load_and_authorize_resource
...
def update
...
respond_to do |format|
if @health_promoter.update_attributes(params[:health_promoter])
sign_in(@health_promoter, :bypass => true) if @current_user.id == @health_promoter.id
format.html { redirect_to @health_promoter, notice: 'Health Promoter was successfully updated.' }
format.json { head :no_content }
else
format.html { render action: "edit" }
format.json { render json: @health_promoter.errors, status: :unprocessable_entity }
end
end
end
当我们转到编辑health_promoter页面并输入密码和password_confirmation时,当password_archivable.rb代码尝试设置时,Devise Security Extension失败并显示encrypted_password和password_salt的批量分配错误:
OldPassword.new(old_password_params)
ActiveModel::MassAssignmentSecurity::Error at /health_promoters/1
Can't mass-assign protected attributes: encrypted_password, password_salt
我们尝试将:encrypted_password和:password_salt添加到attr_accessible列表,但无济于事。 Devise文档(github.com/plataformatec/devise/blob/3d9dea39b2978e3168604ccda956fb6ec17c5e27/lib/devise/models/authenticatable.rb)说我们可以使用:force_except或:except但不清楚应该如何或在何处指定它。
我们使用以下版本: Ruby 2.0.0p451,Rails 3.2.19,Devise 3.2.4,Devise Security Extension 0.8.0
非常感谢任何帮助。
答案 0 :(得分:0)
将设计安全扩展程序降级到0.7.2,以便快速修复,因为它可以正常工作