如何为广播身份验证路由定义或传递身份验证守卫而不是默认身份验证守卫?

mso*_*wal 5 socket.io laravel laravel-authorization laravel-echo laravel-5.4

我对实时事件广播非常陌生,我有简单的 laravel-echo-server 设置并处理所有内容。我无法针对其他身份验证设置/定义身份验证,它始终guard检查 我已为每个守卫专用通道设置的身份验证路由,如下每个文档所示。user/default guardauth.phproutes/channel.php

对于 authguard 用户私人频道

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

对于 authguard 管理员私人频道

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

它对于第一个案例的守卫工作得很好user,但对于第二个案例(即守卫)却不起作用admin。和

Log::info(class_basename($admin))总是返回User类。

那么,我们如何传递或定义它应该使用adminguard而不是user. 探索内部之后Illuminate\Broadcasting\Broadcasters\Broadcaster我发现下面一行411

public function user($guard = null)
{
    return call_user_func($this->getUserResolver(), $guard);
}
Run Code Online (Sandbox Code Playgroud)

所以,如果我们能传递这个guard参数就可以解决目的了。如果有人能给我任何东西或授权多个警卫设置的方式,那将非常有帮助。使用Laravel 5.4, laravel-echo-server, Redis, Socket.IO

小智 0

就像在其他地方一样,只需在闭包中使用Request 门面即可。

在你的情况下:

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

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