Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot 使用SSI在Nginx后面运行两个Spring引导应用程序_Spring Boot_Nginx_Single Sign On_Keycloak_Ssi - Fatal编程技术网

Spring boot 使用SSI在Nginx后面运行两个Spring引导应用程序

Spring boot 使用SSI在Nginx后面运行两个Spring引导应用程序,spring-boot,nginx,single-sign-on,keycloak,ssi,Spring Boot,Nginx,Single Sign On,Keycloak,Ssi,简言之——我有两个Spring Boot应用程序,在Nginx后面运行KeyClope身份验证,我想通过SSI将App2的内容使用到App1中。此外,单点登录也是一项要求,因此不需要分别登录两个应用程序 我的设置如下: 分别在本地主机端口9000和9001运行的两个Spring引导应用程序(App1和App2)都提供HTML标记,这些标记可以包含在SSI中以组成最终页面。这两个应用程序都是安全的,需要用户登录。App1的上下文根位于/,App2的上下文根位于/App2 用于使用OIDC管理用

简言之——我有两个Spring Boot应用程序,在Nginx后面运行KeyClope身份验证,我想通过SSI将App2的内容使用到App1中。此外,单点登录也是一项要求,因此不需要分别登录两个应用程序


我的设置如下:

  • 分别在本地主机端口9000和9001运行的两个Spring引导应用程序(App1和App2)都提供HTML标记,这些标记可以包含在SSI中以组成最终页面。这两个应用程序都是安全的,需要用户登录。App1的上下文根位于
    /
    ,App2的上下文根位于
    /App2
  • 用于使用OIDC管理用户身份验证的KeyClope服务器。App1和App2都配置为使用Spring Security KeyClope适配器与服务器通信,并在KeyClope中注册为单个客户端
  • 我将Nginx用作面向用户的反向代理。SSI已启用。App1和App2在Nginx配置中的两个独立的
    位置注册。请参阅下面的
    nginx.conf
    文件
我试图实现的用例:

  • App1提供的HTML页面基本上是一个“shell”应用程序——包含布局和页眉、页脚。在内容区域中,有一个SSI
    include virtual
    指令,它从App2中提取内容
  • 最后,我希望看到一个由App1提供服务的页面,其中包含来自App2的内容
  • 显然,这两个应用程序都需要登录,但由于我已经配置了keydepot,而且两个应用程序都使用相同的KC领域和客户端ID,所以登录其中任何一个都应该足够了
发生了什么:

  • 当我点击App1时,我还没有登录,我看到shell应用程序没有任何来自App1或App2的受保护内容。这很好
  • 我一登录到App1,就会在路径
    /
    处设置
    JSESSIONID
    和cookie。但是,没有看到来自App2的内容[应该来自SSI include]
  • 当我转到由App2提供服务的页面时,它会立即识别用户,无需再次登录,所有受保护的内容都会被提供。App2正常工作。App2还在路径
    /App2
    中存储
    JSESSIONID
    cookie
到目前为止我所尝试的:

  • 尝试了Nginx cookie路径重写以将两个cookie存储在路径
    /
    处。这会导致两个cookie冲突并相互重置
  • 已尝试将App1和App2注册为KeyClope中的独立客户端
  • 我知道的是,当Nginx中的SSI处理器读取App1提供的shell页面时,它需要向App2发出请求以填充SSI内容,但为此,它需要App2的适当cookie来验证请求。为此尝试了几种试错方法
我试图实现的用例是否有问题,或者我做错了什么?Spring/Java/keydave/Nginx初学者,在此提前感谢


nginx.conf
文件

worker\u进程1;
事件{
工人(1024);;
}
错误日志/error.log警告;
http{
包括mime.types;
默认_类型应用程序/八位字节流;
发送文件到;
保持生命超时65;
服务器{
听80;
服务器名称localhost;
ssi-on;
客户最大身体尺寸为100M;
端口_in_重定向关闭;
代理集头X-Real-IP$remote\u addr;
$remote\u addr的代理\u集\u头X转发;
代理设置头主机$Host;
代理集头X转发主机$Host;
代理设置头X转发服务器$host;
proxy_http_版本1.1;
代理集头X-Forwarded-App-Proto http;
代理集头X转发App端口80;
#适用于App1
地点/{
代理通行证http://localhost:9000;
}
#适用于App2
地点/附件2/{
#请注意,没有尾随/-这意味着整个URL将被保留
#即,不会从发送到代理的URL中丢弃“/app2”
#这正是我们想要的,因为我们的spring应用程序的上下文根位于“/app2”
代理通行证http://localhost:9001;
#proxy_cookie_path~*^/*/;--这会导致两个JSSessionID cookie发生冲突
}
错误_第302 404 500 502 503 504/50x.html页;
location=/50x.html{
根html;
}
}
}
application.yml
App1和App2的文件:

服务器:
servlet:
contextPath:/app2#这只是App1的“/”
端口:9001#这是App1的9000
使用转发头:true
tomcat:
协议头:X-Forwarded-App-Proto
端口头:X-Forwarded-App-port
##########钥匙斗篷配置
钥匙斗篷:
验证服务器url:http://localhost:8080/auth
领域:AppRealm
资源:AppClient
公共客户:对
主体属性:首选的\u用户名
安全:
禁用csrf:true

写得很好的问题!我很想帮你,但我完全不知道SSI是如何工作的:(你看过KeyClope和app2日志了吗?似乎app1试图包含来自app2的内容,但它没有任何权限。这个“包括”吗发生在服务器端?@XtremeBiker谢谢。App2和Keyclove没有显示日志。也许我需要提高日志记录级别,看看是否有任何显示。关于SSI,是的,它发生在服务器端,基本上是Nginx中的一个小处理器,它解释特殊的HTML标记并基于它们,从该标记的URL中提取内容,然后插入到在将响应发送给客户端之前,标记的位置。尽管您对SSI不太熟悉,但通过我尝试实现的用例的一眼,是否有任何明显的错误