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

Laravel中生成含用户数据的QR Code,扫码跳转展示未授权用户信息

在Laravel中给未授权用户通过QR码传递数据到目标页面的方案

针对未授权用户通过扫码查看指定数据的需求,下面提供几种实用的实现方案,根据你的数据敏感程度选择即可:


方案一:URL明文传递参数(适合非敏感数据)

直接把用户标识(比如ID)作为查询参数拼入目标页面的URL,生成QR码后,扫码跳转时控制器读取参数并获取对应数据。

步骤1:生成带参数的QR码

假设你用SimpleSoftwareIO/QrCode包生成QR码,控制器代码如下:

use SimpleSoftwareIO\QrCode\Facades\QrCode;
use App\Models\User;

public function generateQrCode($userId)
{
    // 获取用户基础数据
    $user = User::findOrFail($userId);
    // 拼接目标页面路由,带上用户ID参数
    $targetUrl = route('unauthorized.user.data', ['userId' => $user->id]);
    // 生成QR码
    $qrCode = QrCode::size(300)->generate($targetUrl);
    
    return view('qr-code-display', compact('qrCode'));
}

步骤2:配置目标页面路由(无需授权中间件)

// routes/web.php
Route::get('/public/user-data/{userId}', [UserController::class, 'showPublicUserData'])
    ->name('unauthorized.user.data');

步骤3:控制器读取参数并传递到视图

public function showPublicUserData($userId)
{
    // 只查询允许公开的字段,避免泄露敏感信息
    $user = User::select('id', 'name', 'public_profile')->findOrFail($userId);
    return view('user-public-data', compact('user'));
}

视图展示数据(blade文件)

<div class="user-data">
    <h3>用户信息</h3>
    <p>ID: {{ $user->id }}</p>
    <p>姓名: {{ $user->name }}</p>
    <p>公开简介: {{ $user->public_profile }}</p>
</div>

注意:此方法仅适用于非敏感数据,因为URL参数是明文,容易被篡改或窃取。


方案二:加密URL参数(适合需保密的数据)

对传递的用户标识进行加密,防止参数被篡改或直接读取,提升安全性。

步骤1:生成加密参数的QR码

use Illuminate\Support\Facades\Crypt;
use SimpleSoftwareIO\QrCode\Facades\QrCode;
use App\Models\User;

public function generateQrCode($userId)
{
    $user = User::findOrFail($userId);
    // 加密用户ID
    $encryptedId = Crypt::encryptString($user->id);
    // 拼接带加密参数的URL
    $targetUrl = route('unauthorized.user.data', ['encryptedId' => $encryptedId]);
    $qrCode = QrCode::size(300)->generate($targetUrl);
    
    return view('qr-code-display', compact('qrCode'));
}

步骤2:路由与控制器解密并验证

// routes/web.php
Route::get('/secure/user-data', [UserController::class, 'showSecureUserData'])
    ->name('unauthorized.user.data');

控制器代码:

use Illuminate\Contracts\Encryption\DecryptException;
use Illuminate\Support\Facades\Crypt;

public function showSecureUserData(Request $request)
{
    // 验证参数必填
    $request->validate([
        'encryptedId' => 'required|string',
    ]);

    try {
        // 解密参数
        $userId = Crypt::decryptString($request->encryptedId);
        // 获取用户数据(限制字段)
        $user = User::select('id', 'name', 'confidential_info')->findOrFail($userId);
        return view('user-secure-data', compact('user'));
    } catch (DecryptException $e) {
        // 参数被篡改或无效,返回403禁止访问
        return abort(403, '无效的访问链接');
    }
}

注意:加密后的URL会变长,但能有效防止数据泄露和篡改,适合有保密需求的场景。


方案三:临时访问令牌(适合一次性/限时访问)

生成关联用户的临时令牌,扫码后验证令牌有效性,支持控制访问次数和有效期,安全性最高。

步骤1:创建临时令牌模型

先创建TempAccessToken模型和迁移文件,包含字段:user_id(关联用户)、token(随机令牌)、expires_at(过期时间)、used_at(使用时间,可选)。

迁移文件示例:

Schema::create('temp_access_tokens', function (Blueprint $table) {
    $table->id();
    $table->foreignId('user_id')->constrained()->onDelete('cascade');
    $table->string('token')->unique();
    $table->timestamp('expires_at');
    $table->timestamp('used_at')->nullable();
    $table->timestamps();
});

步骤2:生成带令牌的QR码

use Illuminate\Support\Str;
use SimpleSoftwareIO\QrCode\Facades\QrCode;
use App\Models\User;
use App\Models\TempAccessToken;

public function generateQrCode($userId)
{
    $user = User::findOrFail($userId);
    // 生成40位随机令牌
    $token = Str::random(40);
    // 创建临时令牌,设置1小时有效期
    TempAccessToken::create([
        'user_id' => $user->id,
        'token' => $token,
        'expires_at' => now()->addHour(),
    ]);
    
    $targetUrl = route('unauthorized.user.data', ['token' => $token]);
    $qrCode = QrCode::size(300)->generate($targetUrl);
    
    return view('qr-code-display', compact('qrCode'));
}

步骤3:验证令牌并返回数据

// routes/web.php
Route::get('/limited/user-data', [UserController::class, 'showLimitedUserData'])
    ->name('unauthorized.user.data');

控制器代码:

public function showLimitedUserData(Request $request)
{
    $request->validate([
        'token' => 'required|string',
    ]);

    // 查找未过期且未使用的令牌
    $tempToken = TempAccessToken::where('token', $request->token)
                                ->where('expires_at', '>', now())
                                ->whereNull('used_at')
                                ->firstOrFail();

    // 标记令牌已使用,防止重复访问
    $tempToken->update(['used_at' => now()]);

    // 获取用户数据
    $user = User::select('id', 'name', 'limited_access_info')->findOrFail($tempToken->user_id);
    return view('user-limited-data', compact('user'));
}

注意:需定期清理过期或已使用的令牌,可通过Laravel任务调度实现自动清理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 05:35:10