Laravel 5.6如何硬编码用户ID限制Demo账号的增改权限?
简单实现Laravel 5.6 Demo账号的写入操作限制
这种需求完全不用搞复杂的权限系统,硬编码用户ID就能搞定,给你几个简单直接的方案,按需选择就行:
方案1:控制器方法内直接判断(最直观,适合小项目)
如果你的写入操作(比如store、update)分散在少数几个控制器里,直接在对应方法开头加判断就行。假设你的Demo用户ID是1,替换成你实际的ID:
public function store(Request $request) { // 检查当前用户是否是Demo账号 if (auth()->id() === 1) { return back()->withErrors(['msg' => 'Demo账号无法执行添加操作']); } // 原来的创建逻辑写在这里 // ... } public function update(Request $request, $id) { if (auth()->id() === 1) { return back()->withErrors(['msg' => 'Demo账号无法执行修改操作']); } // 原来的更新逻辑写在这里 // ... }
优点:快速上手,不用额外配置;缺点:如果控制器多,会有重复代码。
方案2:用中间件批量拦截(适合多路由/控制器场景)
创建一个专门的中间件,拦截所有写入请求(POST/PUT/PATCH),检查用户ID后阻止Demo账号的操作:
步骤1:创建中间件
执行Artisan命令生成中间件:
php artisan make:middleware RestrictDemoUser
步骤2:编写中间件逻辑
打开app/Http/Middleware/RestrictDemoUser.php,修改handle方法:
public function handle($request, Closure $next) { $demoUserId = 1; // 替换成你的Demo用户ID // 只对已登录的Demo用户生效 if (auth()->check() && auth()->id() === $demoUserId) { // 拦截所有写入类型的请求 $writeMethods = ['POST', 'PUT', 'PATCH']; if (in_array($request->method(), $writeMethods)) { return back()->withErrors(['msg' => 'Demo账号无法执行写入操作']); // 如果是API接口,可以返回JSON: // return response()->json(['error' => 'Demo账号无法执行写入操作'], 403); } } return $next($request); }
步骤3:注册中间件
打开app/Http/Kernel.php,在$routeMiddleware数组里添加中间件别名:
protected $routeMiddleware = [ // ...其他中间件 'restrict.demo' => \App\Http\Middleware\RestrictDemoUser::class, ];
步骤4:应用中间件到路由
把中间件绑定到需要限制的路由上,比如资源路由:
// 对整个资源路由生效 Route::resource('posts', 'PostController')->middleware('restrict.demo'); // 或者只针对写入方法 Route::post('posts', 'PostController@store')->middleware('restrict.demo'); Route::put('posts/{post}', 'PostController@update')->middleware('restrict.demo');
优点:一次配置,批量生效;缺点:需要熟悉中间件的使用,但操作也很简单。
方案3:模型事件全局拦截(最全面,覆盖所有写入场景)
如果希望不管是从控制器、命令行还是其他地方触发的写入操作,都能阻止Demo账号,用模型事件最合适:
在你想要限制的模型(比如Post、User)的boot方法里添加监听:
protected static function boot() { parent::boot(); $demoUserId = 1; // 替换成你的Demo用户ID // 阻止创建新记录 static::creating(function ($model) use ($demoUserId) { if (auth()->check() && auth()->id() === $demoUserId) { // 返回false会终止创建操作 return false; // 或者抛出异常给前端提示: // throw new \Exception('Demo账号无法创建内容,请使用正式账号操作'); } }); // 阻止更新记录(只有当模型有字段修改时才拦截) static::saving(function ($model) use ($demoUserId) { if (auth()->check() && auth()->id() === $demoUserId && $model->isDirty()) { return false; // throw new \Exception('Demo账号无法修改内容,请使用正式账号操作'); } }); }
优点:全局生效,不管哪里触发写入都会被拦截;缺点:如果有多个模型,需要每个模型都加这段代码(可以抽成Trait来复用)。
小提示
- 记得把所有代码里的
1替换成你实际的Demo用户ID; - 错误提示可以根据你的系统风格调整,比如返回视图、JSON或者跳转;
- 如果需要限制删除操作,只需要在对应方案里加上
DELETE方法(中间件)或者deleting事件(模型)就行。
内容的提问来源于stack exchange,提问作者SNaRe
相关产品推荐
相关产品推荐

