如何为广播认证路由定义或传递auth guard而不是默认的auth guard?

时间:2017-04-28 14:31:28

标签: laravel socket.io laravel-5.4 laravel-authorization laravel-echo

我对实时事件广播很新,我有简单的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 admin私人频道

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

2 个答案:

答案 0 :(得分:0)

就像在其他地方一样,只需在闭包中使用Request facade

在你的情况下:

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

发送给闭包的参数不能由用户更改,它由laravel框架控制。 (请参阅BroadcastManageRedisBroadcaster,或Illumiante\Contracts\Broadcasting\Broadcaster)的其他实现

答案 1 :(得分:0)

我最终使它可以与2个单独的登录屏幕和2个单独的user和customers表一起使用。

首先,我在私人频道播放了Laracasts视频。该视频说明要将所有回显事件侦听器放入bootstrap.js中。这将与一个用户表一起使用。但是,对于2个单独的表用户,客户需要将相关的回显事件侦听器放置在2个单独的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. });

然后在您的route / channels.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();

客户可以收到私人消息,用户也可以。希望这会有所帮助。