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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:00:39