You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel中如何通过数据透视表限制用户仅查看自身创建的公司?

解决用户仅能查看自己创建的公司的权限问题

首先咱们得明确核心:你的company_user多对多表应该是用来记录用户加入的公司,但创建者和公司是一对一的归属关系(一个公司只能有一个创建者),所以第一步得先补全表结构来区分创建者,再做权限校验。

1. 给companies表添加创建者字段

先给companies表新增creator_id字段(外键关联users.id):

# 生成迁移文件
php artisan make:migration add_creator_id_to_companies_table --table=companies

打开生成的迁移文件,写入以下内容:

public function up()
{
    Schema::table('companies', function (Blueprint $table) {
        $table->unsignedBigInteger('creator_id')->nullable();
        $table->foreign('creator_id')->references('id')->on('users')->onDelete('set null');
    });
}

public function down()
{
    Schema::table('companies', function (Blueprint $table) {
        $table->dropForeign(['creator_id']);
        $table->dropColumn('creator_id');
    });
}

最后运行迁移:

php artisan migrate

2. 建立模型关联

在Company模型里添加和创建者的关联:

// app/Models/Company.php
public function creator()
{
    return $this->belongsTo(User::class);
}

在User模型里添加“自己创建的公司”的关联(同时保留原有的多对多关联):

// app/Models/User.php
// 关联自己创建的公司
public function createdCompanies()
{
    return $this->hasMany(Company::class, 'creator_id');
}

// 原有的多对多关联(用户加入的公司)
public function companies()
{
    return $this->belongsToMany(Company::class);
}

别忘了在Company模型里也保留多对多关联:

// app/Models/Company.php
public function users()
{
    return $this->belongsToMany(User::class);
}

3. 实现权限限制逻辑

这里有两种常用方式,按需选择:

方式一:直接在Controller里过滤(快速实现)

修改你的show方法,只查询当前用户创建的公司:

public function show($company_id)
{
    // 仅查询当前用户创建的公司,找不到直接返回404
    $company = auth()->user()->createdCompanies()->where('id', $company_id)->firstOrFail();
    return view('company.settings', compact('company'));
}

方式二:使用Laravel授权策略(推荐,更优雅)

Laravel的Policy是处理权限的最佳实践,适合后续扩展复杂权限:

  1. 生成Company的Policy文件:
php artisan make:policy CompanyPolicy --model=Company
  1. 在app/Policies/CompanyPolicy.php的view方法里添加校验逻辑:
public function view(User $user, Company $company)
{
    // 仅允许公司创建者查看
    return $user->id === $company->creator_id;
}
  1. 在AuthServiceProvider.php里注册Policy:
// app/Providers/AuthServiceProvider.php
protected $policies = [
    Company::class => CompanyPolicy::class,
];
  1. 修改Controller的show方法,使用路由模型绑定+授权:
public function show(Company $company)
{
    // 自动触发Policy校验,不通过则返回403
    $this->authorize('view', $company);
    return view('company.settings', compact('company'));
}

额外提醒:创建公司时记得设置creator_id

当用户创建公司时,要把当前用户ID赋值给creator_id:

// 示例:CompanyController的store方法
public function store(Request $request)
{
    $company = Company::create([
        'name' => $request->name,
        'creator_id' => auth()->id(), // 绑定创建者
    ]);
    
    // 可选:把创建者自动加入公司的多对多关联
    auth()->user()->companies()->attach($company->id);
    
    return redirect()->route('companies.show', $company);
}

这样就能严格限制用户只能查看自己创建的公司了!

内容的提问来源于stack exchange,提问作者Philipp Kishkovarov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:34:26