Как определить или передать защиту авторизации для широковещательных маршрутов аутентификации вместо защиты аутентификации по умолчанию?

Я очень новичок в трансляции событий в реальном времени, у меня есть простая настройка laravel-echo-server и я работаю со всем. Я не могу установить/определить аутентификацию против другой аутентификации guard, она всегда проверяется с помощью user/default guard, определенных в auth.php. Я настроил маршруты аутентификации для каждого частного канала охраны в routes/channel.php, как показано ниже в документации.

Для закрытых каналов пользователя auth guard

Broadcast::channel('users.{id}', function ($user, $id) {
   Log::info(class_basename($user));
   return (int) $user->id === (int) $id;
});

Для частных каналов администратора auth guard

Broadcast::channel('admins.{id}', function ($admin, $id) {
   Log::info(class_basename($admin));
   return (int) $admin->id === (int) $id;
});

Он отлично работает для охранника user, то есть в первом случае, но никогда не работал для второго, то есть admin охранника. и

Log::info(class_basename($admin)) всегда возвращает класс User.

Итак, как нам передать или определить, что он должен использовать защиту admin вместо user. осмотрев внутреннюю часть Illuminate\Broadcasting\Broadcasters\Broadcaster я обнаружил, что ниже в строке 411

public function user($guard = null)
{
    return call_user_func($this->getUserResolver(), $guard);
}

Итак, если мы можем передать этот параметр защиты, это может решить задачу. Если кто-нибудь может дать мне что-нибудь или способ авторизации с несколькими настройками защиты, это будет очень полезно. Использование Laravel 5.4, laravel-echo-server, Redis, Socket.IO


person msonowal    schedule 28.04.2017    source источник


Ответы (2)


Как и в другом месте, просто используйте Request фасад в замыкании.

В твоем случае:

Broadcast::channel('admins.{id}', function ($user, int $id) {
   return Request::user('admin')->id === $id;
});

Аргументы, отправленные в замыкание, не могут быть изменены пользователем, они контролируются фреймворком laravel. (см. BroadcastManage и RedisBroadcaster или другие реализации Illumiante\Contracts\Broadcasting\Broadcaster)

person Community    schedule 02.04.2018

Наконец-то я заставил это работать с двумя отдельными экранами входа в систему и двумя отдельными таблицами пользователей и клиентов.

Во-первых, я следил за видео Laracasts в эфире частного канала. В видео говорится, что нужно поместить все прослушиватели эхо-событий в ваш bootstrap.js. Это будет работать с одной таблицей пользователей. Однако для двух отдельных пользователей таблиц и клиентов вам необходимо разместить соответствующие прослушиватели эхо-событий в двух отдельных файлах макетов app.blade.php. Для пользователей в одном и для клиентов в другом. Однако слушатели должны располагаться внизу.

window.Echo.private('App.User.' +     window.Laravel.user.id) .listen('Event', e => { etc. });

window.Laravel = {!! json_encode([ 'customer' => auth()->guard('customer')->user() ]) !!};

window.Echo.private('App.Customer.' + window.Laravel.customer.id) .listen('Event', e => { etc. });

Затем в ваших маршрутах/каналах.php

Broadcast::channel('App.User.{id}', function ($user, $id)
return (int) $user->id === (int) $id;
});

Broadcast::channel('App.Customer.{id}', function ($user, $id)
return (int) auth()->guard('customer')->user()->id === (int) $id;
}); // Note I do not compare "$user" here

Затем в BroadcastServiceProvider.php

Broadcast::routes(['middleware' => 'web', 'auth:customer']);
require base_path('routes/channels.php');

//Remove Broadcast::routes();

Клиент может получить личное сообщение, как и пользователь. Надеюсь это поможет.

person Big Pete    schedule 23.01.2020