gpt4 book ai didi

java - jetty启动后如何在嵌入式jetty中配置安全处理程序

转载 作者:行者123 更新时间:2023-12-02 10:35:57 24 4
gpt4 key购买 nike

我正在尝试在 Jetty 启动后在 Jetty 中的 ServletContext 上配置安全处理程序。

像这样:

Handler[] contextHandlers = contexts.getHandlers();
for(Handler context : contextHandlers) {
if(context instanceof ServletContextHandler && ((ServletContextHandler) context).getContextPath().equals("/api")) {
context.setSecurityHandler(securityHandler);
break;
}

但我遇到以下异常:

java.lang.IllegalStateException: STARTED

at org.eclipse.jetty.servlet.ServletContextHandler.setSecurityHandler(ServletContextHandler.java:483)

为什么这是不可能的?

屏幕截图:

enter image description here

编辑:

我查看了源代码,它检查 isStarted 标志。 jetty启动后添加安全处理程序是否存在安全缺陷?:

public void setSecurityHandler(SecurityHandler securityHandler)
{
if (isStarted())
throw new IllegalStateException("STARTED");

if (_securityHandler!=null)
_securityHandler.setHandler(null);
_securityHandler = securityHandler;
relinkHandlers();
}

(原因,我必须这样做有点复杂,但我会尝试解释:我正在代理后面运行一个 keycloak 服务器,该代理可以通过我的 Jetty 服务器访问。假设 Jetty 在 host1 上运行, keycloak 正在 host2 上运行。但是在设置 keycloak 安全处理程序时,无论配置了哪个主机,keycloak 都只允许对从该域生成的 token 进行身份验证。因此我想在安全处理程序中配置 Jetty 主机,该处理程序在 Jetty 启动之前不可用)

最佳答案

您无法修改正在运行(已启动)的 Web 应用程序上的 SecurityHandler

这主要是由于 Servlet 初始化生命周期的性质以及需要访问安全层及其配置的大量组件造成的。

您无法将该层拉出来并在事后更改它。

您必须调用:

myWebAppContext.stop();
myWebAppContext.setSecurityHandler(mySuperDooperSecurityHandler);
myWebAppContext.start();

关于java - jetty启动后如何在嵌入式jetty中配置安全处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53293147/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com