【问题标题】:Devise gem and User model设计 gem 和用户模型
【发布时间】:2012-07-15 06:21:43
【问题描述】:

Devise 的示例和教程说我在用户模型中有这样的东西:

attr_accessible :name, :password, :password_confirmation, :remember_me

所以我对此有两个问题。

  1. 为什么要让“名称”和“密码”可访问?我希望他们受到保护,设计是否让我改变这一点?

  2. 像“password_confirmation”和“remember_me”这样的字段在用户模型中到底有什么作用?现在我可以写User.find(1).password_confirmation之类的东西了,它可以工作但完全没有意义。

如何处理?

【问题讨论】:

  • 2 美分:大约password_confirmation,你觉得奇怪是对的 - 代码味道在某种程度上 - 这不是域的问题;但它容易所以我们做到了。关于remember_me - IMO 它是域的一部分 - 就User 被用于类似你知道的身份验证的目的而言。
  • Devise 不会在您的模型上打扰或强制执行任何操作 - 您可以决定您想要什么。也适用于attr_accessible。 IMO,“敏感”字段,例如“is_admin”或“paid_for_subscription”等属性,不得批量分配。密码字段实际上只是该用户的任何其他数据,因此在用户的上下文中批量分配是可以的。当然,您不希望其他用户修改其他用户的数据,但这不是 attr_accessible 旨在防止的 - 这取决于您的保护(想想“范围界定”)。

标签: ruby-on-rails devise


【解决方案1】:

您需要访问所有这四个字段才能创建登录和注册表单。您不必担心数据库中的密码字段,它们只是虚拟属性。您可以在模式中确认的数据库中的实际字段实际上是 encrypted_pa​​ssword 和 salt。它实际上是一个功能强大、经过验证且安全的系统。您应该专注于应用其他部分的创新,并让 devise 为您完成工作,它做得很好。

【讨论】:

  • 我不希望“name”字段可以批量分配(由我决定,不是 Devise,不是吗?),我不希望像“password_confirmation”这样的垃圾在用户模型中(它不是模型的一部分,它只是注册表的一部分)。
【解决方案2】:

我想我找到了答案。

  1. Devise 使用批量赋值,您对此无能为力。有一个关于此的 Github 问题:https://github.com/plataformatec/devise/pull/718。我正在研究如何改变 Devise 以避免它依赖于批量分配。我很高兴知道您的意见。

  2. 只要 Devise 剥夺了您定义我们的 attr-accessible 列表的权利,您就可以做两件事:

    一个。您可以只使用attr_readonlyattr_accessible。它将为设计打开大门,但不会为您的其他表格打开大门,请阅读Make attributes mass assignable only during creation

    b. def mass_assignment_authorizer 允许您定义动态属性可访问列表,请阅读 http://railscasts.com/episodes/237-dynamic-attr-accessible?view=asciicast。恕我直言,这种方式对于这类问题来说是多余的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多