码头启动后,如何在嵌入式码头中配置安全处理程序

时间:2018-11-14 04:20:19

标签: java jetty keycloak embedded-jetty

在启动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:已开始

     在

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

为什么这不可能?

屏幕截图:

enter image description here

编辑:

我查看了源代码,并在其中检查isStarted标志。在码头开始后添加安全处理程序是否存在安全漏洞?

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

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

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

1 个答案:

答案 0 :(得分:1)

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

这主要是由于Servlet初始化生命周期的性质以及无数需要访问安全性层及其配置的组件所致。

您不能拉出该层并在事后更改它。

您必须致电:

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