Радиовещание для нескольких охранников

У меня есть следующие параметры безопасности, определенные для моего приложения admins, designers, customers и т. д. по умолчанию охранник является designer guard,

Я хочу каждый guard иметь свой собственный private channel, Поэтому я определяю его в моем channel.php с несколькими записями для каждого, как показано ниже

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


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

});

Но это всегда binding с default 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');
}

Сейчас в channel.php

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

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

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

Я отправляю этот ответ для всех, кто может столкнуться с проблемой в любое время. Я использую laravel 7 иbeyondcode/laravel-websockets. Пока я копаюсь в исходном коде, указание промежуточного ПО в BoradcastServiceProvider.php не работает. Единственный способ определить защиту для канала - это указать параметры для канала:

 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;
        }
    }
}
Другие вопросы по тегам