1

以前的rails 4我在一个模型中

class User < ActiveRecord::Base
  attr_accessible :name, :email, :password, :password_confirmation

  ...
end

但现在strong_parameters替换了,protected_attributes所以我评论它并使用permit.

现在我发现我可以在未经允许的情况下访问属性。

rails c我设法做到这一点:

2.0.0p247 :002 >   User.new(admin: "1")
 => #<User id: nil, name: nil, email: nil, created_at: nil, updated_at: nil, password_digest: nil, remember_token: nil, admin: true> 

2.0.0p247 :016 >   user = User.new(name: 'Nir', email: 'nir@example.com', password: 'foobar', password_confirmation: 'foobar', admin: "1")
 => #<User id: nil, name: "Nir", email: "nir@example.com", created_at: nil, updated_at: nil, password_digest: "$2a$10$xVnY8ydd5SoaLVipK5j4Del40FrOmu4bKypGjBEwvms7...", remember_token: nil, admin: true>

显然我不应该能够设置和更改管理属性。只有user.toggle(:admin)应该可以。

那么我不理解或应该做对什么。以及如何使这个测试通过:

  describe "accessible attributes" do
    it "should not have allow access to admin" do
      expect do
        User.new(admin: "1")
      end.to raise_error(ActiveModel::MassAssignmentSecurity::Error)
    end
  end
4

1 回答 1

1

为防止用户设置admin属性,您不应其添加为permit方法的参数。

params.require(:user).permit(:name, :whatever_else_you_allow)

其中的关键字是:(params它处理参数)和permit(您告诉 rails 允许哪些属性)。

Strong Parameters将禁止在 Active Model 批量分配中使用 Action Controller 参数,直到它们被列入白名单。但是,在您的测试中,您直接在 model 上设置属性。没有什么能阻止你这样做。

于 2013-07-13T21:50:59.860 回答