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是处理权限的最佳实践,适合后续扩展复杂权限:
- 生成Company的Policy文件:
php artisan make:policy CompanyPolicy --model=Company
- 在
app/Policies/CompanyPolicy.php的view方法里添加校验逻辑:
public function view(User $user, Company $company) { // 仅允许公司创建者查看 return $user->id === $company->creator_id; }
- 在
AuthServiceProvider.php里注册Policy:
// app/Providers/AuthServiceProvider.php protected $policies = [ Company::class => CompanyPolicy::class, ];
- 修改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
相关产品推荐
相关产品推荐

