Skip to content

Locked

#[Locked] 属性防止属性在客户端被修改,保护敏感数据(如模型 ID)免受用户篡改。

基本用法

#[Locked] 属性应用到任何不应从前端更改的公共属性上:

php
<?php // resources/views/components/post/⚡show.blade.php

use Livewire\Attributes\Locked;
use Livewire\Component;
use App\Models\Post;

new class extends Component
{
    #[Locked] // [tl! highlight]
    public $postId;

    public function mount($id)
    {
        $this->postId = $id;
    }

    public function delete()
    {
        Post::find($this->postId)->delete();

        return redirect('/posts');
    }
};

如果用户尝试通过浏览器开发工具或篡改请求来修改锁定的属性,Livewire 将抛出异常并阻止操作执行。

后端修改仍然允许

具有 #[Locked] 属性的属性仍然可以在组件的 PHP 代码中更改。锁定仅防止客户端篡改。在您自己的方法中,小心不要将不受信任的用户输入传递给锁定的属性。

何时使用

在需要以下功能时使用 #[Locked]

  • 存储不应被用户更改的模型 ID
  • 在整个组件生命周期中保留授权敏感数据
  • 保护任何作为安全边界的公共属性

模型属性默认安全

如果您在公共属性中存储 Eloquent 模型,Livewire 会自动确保 ID 不被篡改——不需要 #[Locked] 属性:

php
<?php // resources/views/components/post/⚡show.blade.php

use Livewire\Component;
use App\Models\Post;

new class extends Component
{
    public Post $post; // 已经受保护 [tl! highlight]

    public function mount($id)
    {
        $this->post = Post::find($id);
    }
};

为什么不使用受保护的属性?

您可能想知道为什么不能只对敏感数据使用 protected 属性。

请记住,Livewire 只在请求之间持久化公共属性。受保护的属性适用于静态的硬编码值,但任何需要在运行时存储的数据都必须使用公共属性才能在请求之间正确持久化。

这就是 #[Locked] 变得至关重要的地方:它为您提供了公共属性的持久化能力,并防止客户端篡改。

了解更多

有关锁定属性的完整指南,包括详细的安全考虑和最佳实践,请参阅锁定属性文档