如何使用我的身份验证过滤器和部署在Jetty中的Comes的Websocket?

时间:2015-05-06 05:16:28

标签: authentication websocket jetty cometd

我正在使用带有基于JSR 356的websocket实现的Jetty 9.2.3的Cometd 3.0.1(而不是jetty自己的websocket实现)。

我添加了一些auth过滤器,它基本上要求来自请求的身份验证标头。但是,随着websocket升级作为websocketupgrade过滤器的一部分发生,有没有办法在这里进行身份验证?

1 个答案:

答案 0 :(得分:0)

通过过滤器进行身份验证是完成身份验证的错误方法。

正确解决方案:

servlet规范要求您使用容器和应用程序元数据(WEB-INF/web.xml)的servlet技术设置和配置应用程序的身份验证和授权层

这意味着您可以使用特定于Jetty容器的LoginService或使用JAAS规范配置来设置容器端安全性。然后,您在WEB-INF/web.xml中引用您的安全领域并使用它们。如果你有自定义的东西,那么你可以挂钩到你选择的LoginService(即使是自定义的)并相应地进行管理。

JAAS和LoginService身份验证和授权在所有过滤器和servlet之前应用。

在此方案中,您可以在升级过程中访问身份验证信息,尤其是在ServerEndpointConfig.Configurator.modifyHandshake()

期间

丑陋的黑客解决方案:

手动将org.eclipse.jetty.websocket.server.WebSocketUpgradeFilter添加到WEB-INF/web.xml

然后,您可以在100%的使用案例中尝试让您的身份验证过滤器在此WebSocketUpgradeFilter之前存在。

  

警告:过滤器执行顺序是不是 servlet规范的一部分。小心这一点,因为它似乎在您的开发机器上工作,然后突然无法在QA或生产中工作。仅仅因为元数据中的过滤器集合中的顺序不同。

注意:

  • 路径规范必须为/*
  • 异步支持必须为true
  • 调度程序类型必须仅为REQUEST
  • 请勿为该过滤器设置 contextAttributeKey
  • 所有其他WebSocketUpgradeFilter init-params对于JSR-356的使用无效(它们被各种JSR-356端点配置覆盖)