您好我正在寻找一种方法来在用户进行WebSocket连接时对用户进行身份验证,并且只是在未经过身份验证的情况下关闭连接。我使用Dropwizard框架和Atmosphere进行WebSocket连接。 Here是我使用的示例。 如果我能在连接建立时使用Dropwizard提供的“@Auth”注释进行身份验证,那将会很棒。
答案 0 :(得分:3)
你是如何揭露这一点的?是通过JavaScript前端吗?
您正在使用基于servlet的方法,如链接中所述:https://cvwjensen.wordpress.com/2014/08/02/websockets-in-dropwizard/,而不是球衣氛围扩展?
如果您使用基于servlet的方法,建议使用基于令牌的方法将令牌放入http标头中,然后在@Ready处理程序方法中访问此标头,如下所示:
@Ready
public String onReady(final AtmosphereResource resource) {
String AuthHeader = resource.getRequest().getHeader("Authorization");
...DO AUTH HERE
logger.info("Resource {} connected ", resource.uuid());
return "Connect " + resource.uuid();
}
然后,如果auth失败,您也可以轻松关闭连接。但是,根据您的客户端实现,您可能需要考虑这一点。如果客户端在关闭时自动重新连接,则会出现持续关闭和打开可能导致资源耗尽的套接字的情况。如果auth不成功,您可以存储一个私有变量,该变量指出此实例是否经过身份验证,只是删除发送任何消息或处理来自它的任何消息。这也是让攻击者知道auth失败的“模糊”方式,它只是处于一种不稳定状态;连接,但没有失败或关闭。只是没有收到任何数据。但同样,这是针对您的实施的。
Jwt auth是一个选项,请查看:https://github.com/ToastShaman/dropwizard-auth-jwt。虽然没有公开,但我将此实现移植到了dropwizard 0.8rc3-SNAPSHOT。如果您需要,请告诉我,我可以将其发布到github。