我正在使用带有基于JSR 356的websocket实现的Jetty 9.2.3的Cometd 3.0.1(而不是jetty自己的websocket实现)。
我添加了一些auth过滤器,它基本上要求来自请求的身份验证标头。但是,随着websocket升级作为websocketupgrade过滤器的一部分发生,有没有办法在这里进行身份验证?
答案 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