我正在使用带有强参数的rails 4,并尝试弄清楚如何将强参数设置为不允许带参数的任何属性。
我读了这篇Rails 4 Strong parameters : permit all attributes?并希望做到与此相反。
params.require(:user).permit!
会允许所有属性,我怎么能这样做呢?
app / controllers / application_controller.rb 中的
class ApplicationController < ActionController::Base
# Prevent CSRF attacks by raising an exception.
# For APIs, you may want to use :null_session instead.
protect_from_forgery with: :exception
before_filter :configure_permitted_parameters, if: :devise_controller?
protected
def configure_permitted_parameters
devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:username, :email, :password, :password_confirmation, :remember_me) }
devise_parameter_sanitizer.for(:sign_in) { |u| u.permit(:signin, :password, :remember_me) }
devise_parameter_sanitizer.for(:account_update) {|u| u.permit(:username, :email, :password, :password_confirmation, :current_password)}
devise_parameter_sanitizer.for(:sign_in) { |a| a.permit(:signin, :password, :remember_me) }
devise_parameter_sanitizer.for(:account_update) {|a| a.permit(:username, :email, :password, :password_confirmation, :current_password)}
end
end
app / models / admin.rb
class Admin < ActiveRecord::Base
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable, :registerable
devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable
attr_accessor :signin
def self.find_first_by_auth_conditions(warden_conditions)
conditions = warden_conditions.dup
if login = conditions.delete(:signin)
where(conditions).where(["username = :value OR lower(email) = lower(:value)", { :value => login }]).first
else
where(conditions).first
end
end
validates :username, presence: true, length: {maximum: 255}, uniqueness: { case_sensitive: false }, format: { with: /\A[a-zA-Z0-9]*\z/, message: "may only contain letters and numbers." }
end
users.rb模型与admin.rb模型相同。这导致两个不同的注册/签名链接 - 每个模型1。此外,我需要保留:registerable模块,以便我可以覆盖默认设备的可注册模块。但是我修改了视图,以便在浏览器中键入时不显示管理页面。 ---我现在只需要通过命令行阻止它。
我也发布了类似的上一个问题:
答案 0 :(得分:0)
如果您没有使用任何用户输入的参数(例如GET),则根本不需要使用params
。您的控制器将正常工作,并且不会出现安全问题。
答案 1 :(得分:0)
默认行为与.permit相反。如果你没有在params参数中提到一个属性,就像是拒绝用户访问这些属性做任何事情。