Мы пытаемся использовать гем Devise Security Extension для использования функции :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 и вводим пароль и подтверждение_пароля, Devise Security Extension завершается с ошибкой массового назначения для зашифрованного_пароля и пароля_соли, когда password_archivable.rb пытается установить:
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/authenticable.rb) сказано, что мы можем использовать :force_except или :except, но неясно, как и где это должно быть указано.
Мы используем следующие версии: Ruby 2.0.0p451, Rails 3.2.19, Devise 3.2.4, Devise Security Extension 0.8.0.
Любая помощь будет принята с благодарностью.