一个少量上下文和用例:我有这个phoenix应用程序,允许身份验证的用户可以在数据库中搜索以检索公共数据。未经验证的用户使用AJAX呼叫和路由来触发控制器并将JSON响应发送回具有相同的结果。
可以以某种方式将未经验证的用户连接到私人频道,也许是作为客人或其他东西,以便我可以抛弃Ajax?您如何在应用程序中解决此问题?
我这样创建套接字连接:
socket = new Socket('/socket', {params: {guardian_token: app.guardian_token}})
如果可能的话,我应该小心?
谢谢
没有真正的原因你不能这样做。
如果您需要根据用户的身份验证是否返回不同的数据,我可能会做
之一为身份验证和未经身份验证的请求创建不同的频道名称。
"身份验证:房间:4"one_answers"未经身份验证:房间:4"。您可能还需要创建一个MyApp.Authenticated.RoomChannel
模块和MyApp.Unauthenticated.RoomChannel
。不过,如果您有很多频道,这可能会有些失控。
在handle_in/3
功能中创建不同的分支。
在您的联接功能中,在套接字上放一个标记,说明用户是否已验证。然后,在您的handle_in/3
功能中,您可以做
def handle_in(msg, params, socket) do
if socket.assigns.authenticated do
authenticated_request(msg, params, socket)
else
unauthenticated_request(msg, params, socket)
end
end
但是,如果身份验证和未经身份验证的请求之间没有数据差,则没有其他开销。只是用户问的事情。