之前的轨道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>
显然我不能设置和更改admin属性。只有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
答案 0 :(得分:1)
要阻止用户设置admin
属性,您应不将其添加为permit
方法的参数。
params.require(:user).permit(:name, :whatever_else_you_allow)
此处的关键字是:params
(它处理参数)和permit
(您告诉rails允许哪些属性)。
Strong Parameters
将禁止在Active Model批量分配中使用Action Controller参数,直到它们被列入白名单。但是,在您的测试中, 可以直接在模型上设置属性 。没有什么可以阻止你这样做。