根据http://laravel.com/docs/eloquent,可以通过在模型中使用受保护的$ hidden变量来隐藏数组或JSON转换中的属性。
class User extends Eloquent {
protected $hidden = array('password');
}
很好,但是当运行print_r(User::all())
时,加密的密码会从User对象内的服务器发送到客户端。
这不仅限于print_r(),如果查询特定用户,$user->password
将在视图中显示加密密码。
有没有办法阻止这个?每次查询我的用户对象时,密码都将作为数据的一部分与其一起发送,即使它不是必需的。
Illuminate\Database\Eloquent\Collection Object
(
[items:protected] => Array
(
[0] => User Object
(
[hidden:protected] => Array
(
[0] => password
)
[connection:protected] =>
[table:protected] =>
[primaryKey:protected] => id
[perPage:protected] => 15
[incrementing] => 1
[timestamps] => 1
[attributes:protected] => Array
(
[id] => 1
[email] => admin@admin.com
[first_name] => Admin
[last_name] => User
[password] => $2y$10$7Wg2Wim9zHbtGQRAi0z6XeapJbAIoh4RhEnVXvdMtFnwcOh5g/W2a
[permissions] =>
[activated] => 1
[activation_code] =>
[activated_at] =>
[last_login] =>
[persist_code] =>
[reset_password_code] =>
[created_at] => 2013-09-26 10:24:23
[updated_at] => 2013-09-26 10:24:23
)
答案 0 :(得分:27)
运行User::all()
时,它会返回一个Collection对象。此集合包含对象形式的所有用户 。因此,您的用户将包含其密码。这样您就可以出于任何原因显示散列密码。但是,如前所述,如果将Collection或Users转换为数组或JSON,则密码字段应该在隐藏时消失。
因此,如果您想摆脱它们,请尝试运行以下命令:
$array_of_users = Users::all()->toArray();
$json_of_users = Users::all()->toJson();
dd()
这些都是为了检查它们。密码字段将消失。
这在Laravel关于serialization的文档中有解释。
答案 1 :(得分:3)
不,因为你不应该在制作中(或在现实世界中)做类似的事情。
用Blade编写的视图可以收到User::all()
结果并对其进行处理,但这是PHP(服务器),而不是HTML(客户端),它会在将数据传递给HTML之前将其转换为HTML。客户端。
所以这个
print_r(User::all())
是你永远不会向用户展示的东西,它是我们用来调试的东西,但它实际上没有任何意义。
但是,如果您有任何其他示例,当敏感数据可以通过视图传递给您的客户时,我们也可以讨论它。
答案 2 :(得分:0)
如果您在控制器中返回任何表示任何实体的模型对象,则会在laravel中转换为JSON 这对于API创建很有用,并且隐藏字段有很多帮助