User模型是否需要:password和:password_confirmation在authlogic中设置为attr_accesible?

时间:2011-04-02 17:31:28

标签: ruby-on-rails authlogic

我第一次尝试设置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代码在没有明确设置属性可访问的情况下工作但我的不是?

3 个答案:

答案 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攻击,因此使用白名单是最安全的选项,