我第一次尝试设置Authlogic,但我很困惑。
我已根据authlogic_example代码中的示例对其进行了设置,但它似乎无法运行:
u = User.new(:password=>'testpass',
:password_confirmation => 'testpass',
:email => 'test@test.com')
=> #<User id: nil, email: "test@test.com", created_at: nil, updated_at: nil,
first_name: nil, last_name: nil, crypted_password: nil,
password_salt: nil, persistence_token: nil>
>> u.valid?
=> false
>> u.errors
=> #< OrderedHash {:password=>["is too short (minimum is 4 characters)"],
:password_confirmation=>["is too short
(minimum is 4 characters)"]}>
看起来像:密码和:password_confirmation根本没有被设置,所以在我做的用户类:密码和:password_confirmation可访问的属性:
class User < ActiveRecord::Base
acts_as_authentic
attr_accessible :password, :password_confirmation # changed code
end
有效:
>> u = User.new(:password=>'testpass',:password_confirmation => 'testpass',
:email => 'test@test.com')
=> #<User id: nil, email: "test@test.com", created_at: nil, updated_at: nil,
first_name: nil, last_name: nil,
crypted_password: "446edcbee34254ea83b8d469baef2dc34d723e710faf22efb97...",
password_salt: "hZFVKUo66meyrZ97Gb",
persistence_token: "b469fefd82a91683bf51b5eb9dbc15563b569a93ce973a42595...">
>> u.valid?
=> true
虽然这很有效,但我担心我做错了,因为在authlogic_example中,用户中没有设置attr_accessible:
# Authlogic_example code
class User < ActiveRecord::Base
acts_as_authentic
end
为什么authlogic_example代码在没有明确设置属性可访问的情况下工作但我的不是?
答案 0 :(得分:3)
我突然意识到是什么原因引起了我的问题。
我之前在配置文件中更改了mass_assignment的默认设置,以强制所有属性都受到保护,除非另有声明。
回想起来是一个明显的错误,但希望这也可能为其他人节省一些时间
答案 1 :(得分:1)
Attr_accessible是一项安全功能。它告诉您的模型仅在质量分配(如保存)时保存提到的值。我很确定如果你查看你的日志,你会发现质量分配的警告。
如果您尝试使用单个可访问属性保存模型,则只会将其保存在批量分配中。因此,如果你有:密码可访问但是:password_confirmation无法访问,则只会:插入密码,然后你会收到警告。
我认为这可能就是你得到这种行为的原因。
答案 2 :(得分:0)
要添加Peter Nixey的答案,要在rails 3中解决此问题,我更改了以下内容:
# application.rb
config.active_record.whitelist_attributes = false #it was true
设置为true时,将对可以批量分配的所有属性强制执行白名单。这需要禁用,或者您可以使用
将它们添加到白名单中attr_accessible <your attributes>
修改强>
正如彼得在评论中指出的那样;通过将配置设置为false,您可以使用自己的mass_assignment攻击,因此使用白名单是最安全的选项,