laravel 广播多后卫

Posted

技术标签:

【中文标题】laravel 广播多后卫【英文标题】:laravel broadcasting for multiple guard 【发布时间】:2018-12-03 01:30:28 【问题描述】:

我有以下为我的应用程序定义的身份验证保护adminsdesignerscustomers 等。默认保护是designer guard

我希望每个guard 都有自己的private channel。 所以我在我的 channel.php 中定义它,每个条目都有多个条目,如下所示

Broadcast::channel('private.admins.id', function ($admin, $id) 


    Log::info($admin);
    //logging the admin

);

但这始终是 bindingdefault guard 类所以我的问题是我如何告诉它在这里使用 Admin model。 我无法在任何地方找到它。那么你能指出我正确的方向吗

其实我希望每个guard 都有自己的private channel

【问题讨论】:

【参考方案1】:

尝试更改BroadcastServiceProvider文件app\Providers\BroadcastServiceProvider.php

每个守卫的广播认证端点不同

public function boot()

   //Broadcast::routes();
   //match any of the 3 auth guards
   Broadcast::routes(['middleware' => ['web','auth:admins,designers,customers']]);
   require base_path('routes/channels.php');

现在在 channels.php 中

Broadcast::channel('admins.channel.id', function ($model, $id) 
      return $model->id === $id && get_class($model) === 'App\Admin';
);

Broadcast::channel('designers.channel.id', function ($model, $id) 
      return $model->id === $id && get_class($model) === 'App\Designer';
);

Broadcast::channel('customers.channel.id', function ($model, $id) 
      return $model->id === $id && get_class($model) === 'App\Customer';
);

【讨论】:

我先添加 Broadcast::routes([ "middleware" => ["web","auth:admin"] ]); 并且管理员防护工作完美,但是当我添加前缀时,laravel-echo-server 出现错误 404 不要加前缀,我已经更新了答案,你可以试试第二个 使用了这个:Broadcast::routes([ "middleware" => ["web","auth:admin, designer, customer"] ]); 现在没有定义守卫管理员发生的错误 500 !!!!!! 其实我定义了管理员守卫 你必须使用基于前缀的。你的广播授权网址是什么?【参考方案2】:

我正在发布这个答案,给每一个可能会面临这个问题的人。我正在使用 laravel 7 和 beyondcode/laravel-websockets。当我在 BoradcastServiceProvider.php 中指定 midllewares 的源代码中挖掘将不起作用。为通道定义保护的唯一方法是为通道指定选项:

 Broadcast::channel('messaging.organ.id', function ($organ , $id) 
    return $organ->id == $id && get_class($organ) === "App\Organization";
 , ['guards' => ['organ']]);

原因: 因为我使用的是beyondcode/laravel-websockets,所以我在src/Illuminate/Broadcasting/Broadcasters/PusherBroadcaster.php 中挖掘,在这个文件中retrieveUser 方法将获得用户。在此文件中,如果提供了频道选项,则将返回指定警卫中的用户。您可以定义一个或多个守卫,但它只会返回一个作为阵列中第一个守卫登录的用户。

    protected function retrieveUser($request, $channel)

    $options = $this->retrieveChannelOptions($channel);

    $guards = $options['guards'] ?? null;

    if (is_null($guards)) 
        return $request->user();
    

    foreach (Arr::wrap($guards) as $guard) 
        if ($user = $request->user($guard)) 
            return $user;
        
    

【讨论】:

以上是关于laravel 广播多后卫的主要内容,如果未能解决你的问题,请参考以下文章

Laravel (+ Vue.js) 广播 - 如何设置倒计时然后发送广播消息?

为啥 laravel 广播频道有默认前缀?

广播 laravel 事件和多个频道

laravel5.5事件广播系统

带有 Redis 的 Laravel 广播无法工作/连接?

使用 Laravel Echo、laravel-echo-server 和 socket.io 广播将不起作用