Laravel $hidden在雄辩的模型中到底有什么作用?

Laravel $hidden在雄辩的模型中到底有什么作用?,laravel,eloquent,lumen,Laravel,Eloquent,Lumen,我目前正在摆弄Lumen,我正在使用eloquent进行DB交互。 我已经阅读了Eloquent的文档,其中有关于隐藏属性的解释: 有时,您可能希望限制模型的数组或JSON表示中包含的属性,例如密码。为此,请向模型中添加$hidden属性: <?php namespace App; use Illuminate\Database\Eloquent\Model; class User extends Model { /** * The attributes that

我目前正在摆弄Lumen,我正在使用eloquent进行DB交互。 我已经阅读了Eloquent的文档,其中有关于隐藏属性的解释:

有时,您可能希望限制模型的数组或JSON表示中包含的属性,例如密码。为此,请向模型中添加$hidden属性:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = ['password'];
}



Alternatively, you may use the visible property to define a white-list of attributes that should be included in your model's array and JSON representation. All other attributes will be hidden when the model is converted to an array or JSON:
使用php函数hashsha512,$password;对密码进行哈希运算;。它基于12345,只是为了测试:D:P 如预期的那样,哈希密码的长度为128个字符

是否知道这种行为是由模型中定义为隐藏的密码属性引起的

编辑: 这是我散列密码的方式:

$requestData["password"] = hash("sha512", $requestData["password"]);

无法插入密码,因为$fillable数组中没有密码

$fillable数组用于防止大规模赋值。如果要从数组中填充模型属性,则需要将属性名称添加到此数组中

尽管如此,我还是建议您不要将密码添加到$fillable数组中,而是在模型上显式设置密码:

$user = new User($requestData);
$user->password = $requestData["password"];
$user->save();

如注释中所述,$hidden属性仅用于模型转换为数组或转换为JSON时,因此它不应影响插入或其他任何内容。

由于$fillable数组中没有密码,因此不会插入密码

$fillable数组用于防止大规模赋值。如果要从数组中填充模型属性,则需要将属性名称添加到此数组中

尽管如此,我还是建议您不要将密码添加到$fillable数组中,而是在模型上显式设置密码:

$user = new User($requestData);
$user->password = $requestData["password"];
$user->save();

如注释中所述,$hidden属性纯粹用于将模型转换为数组或转换为JSON时,因此它不应对插入或其他任何内容产生影响。

受保护的$hidden是一个数组,是一个模型类参数,它所做的是在查询结果中从数据库中隐藏数组中的列。在您的示例中,$hidden=['password']在用户结果中使“password”列不可见


“protected array$hidden为序列化应隐藏的属性。”

protected$hidden是一个数组,是一个模型类参数,它所做的是在查询结果中从数据库隐藏数组中的列。在您的示例中,$hidden=['password']在用户结果中使“password”列不可见



“protected array$hidden为序列化隐藏的属性。”

据我所知,根据文档,$hidden字段仅对JSON/数组表示隐藏。它们仍然存在于模型中,其他一切都正常工作。您是否在$requestData中散列密码属性?@Rwd是,请参阅附加到OP中的我的编辑!谢谢您不使用内置哈希机制(即bcrypt或argon2)是有原因的吗?@Rwd Erm、bcrypt或我尝试使用的它的一些变体,但据我所知,在同一输入上多次调用时,它没有返回相同的结果。也许我只是把事情搞砸了^^^^然而,我不知道如果散列输入与存储的散列密码不匹配,我将如何根据用户存储的密码来识别用户。据我所知,并且根据文档,$hidden字段仅对JSON/数组表示隐藏。它们仍然存在于模型中,其他一切都正常工作。您是否在$requestData中散列密码属性?@Rwd是,请参阅附加到OP中的我的编辑!谢谢您不使用内置哈希机制(即bcrypt或argon2)是有原因的吗?@Rwd Erm、bcrypt或我尝试使用的它的一些变体,但据我所知,在同一输入上多次调用时,它没有返回相同的结果。也许我只是把事情搞砸了^^^^然而,我不知道如何根据用户存储的密码识别用户,如果散列输入与存储的散列密码不匹配,那么在模型中没有函数的情况下如何显式设置密码,或者必须调用什么函数。@logicalrap示例有:$user->password=。。。。在本例中,我显式地在模型上设置password属性,而不是在数组中传递值,并使用fill方法进行大规模赋值。现在,由于它工作良好,我得到了它。在插入用户详细信息时,我被迫放弃create方法,因为对其他用户列运行create first并显式保存密码会导致错误,例如password字段没有默认值。现在所有列都使用savemethod@Rwd如果在可填充数组中放置密码,会出现哪些安全问题?或者你为什么不推荐它?@MrDave1999这将取决于你如何设置你的应用程序。如果使用填充方法或使用
这是在模型上设置其数据的幕后操作,并且您还有密码作为可填充属性,那么用户可能会覆盖密码,如果您没有将模型设置为在密码持久化之前处理哈希,这将是一个问题。如果模型中没有函数,如何显式设置密码,或者必须调用什么函数。@logicalrap示例有:$user->password=。。。。在本例中,我显式地在模型上设置password属性,而不是在数组中传递值,并使用fill方法进行大规模赋值。现在,由于它工作良好,我得到了它。在插入用户详细信息时,我被迫放弃create方法,因为对其他用户列运行create first并显式保存密码会导致错误,例如password字段没有默认值。现在所有列都使用savemethod@Rwd如果在可填充数组中放置密码,会出现哪些安全问题?或者你为什么不推荐它?@MrDave1999这将取决于你如何设置你的应用程序。如果您在模型上使用fill方法或在幕后使用此方法的其他方法之一来设置其数据,并且您还将password作为可填充属性,则用户可能会覆盖密码,如果您没有将模型设置为在密码持久化之前处理哈希密码,则这将是一个问题。
$user = new User($requestData);
$user->password = $requestData["password"];
$user->save();