【发布时间】:2020-05-27 06:50:48
【问题描述】:
我有一个 Spring Boot 应用程序,除了最重要的部分外,它非常接近工作。基本上设置了四个微服务(还有其他几个,但为了这个问题的目的是四个)。
- 服务注册:一个Eureka服务注册
- 网关:一个 Zuul 网关服务,所有其他服务通过它进行通信,
- 安全性:一个简单的服务,有一个登录网页并实现 JWT 身份验证
- web:一个简单的 Web 应用程序,显示用户必须有权查看的内容
我想要完成的是有一个安全配置来检查有效的 jwt 令牌,如果没有找到,则转发到自定义登录页面。
这很难解释,所以我会编一些端口号来说明。我们可以忘记服务注册端口。
- 网关:8080
- 安全:8081
- 通过网关的安全性:http://localhost:8080/security
- 网址:8082
- Web 通过网关:http://localhost:8080/web
我可以通过网关显示登录页面:http://localhost:8080/security/login,看起来不错。但是当我尝试访问 Web 微服务中的一个页面时:http://localhost:8080/web/page,我希望被转发到http://localhost:8080/security/login,但我看到的是这个页面:http://173.7.8.9:8081/security/login。 ip地址是我编的,但它是我从我的网络分配的ip地址。
我的安全配置如下所示:
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.requestMatchers().permitAll()
// All other requests are authenticated
.anyRequest().authenticated()
.and()
.addFilterAfter(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class)
.formLogin()
.loginPage("/security/login");
}
我认为此设置会起作用,因为我正在尝试访问与请求的网页相同的服务器和端口相关的安全/登录路径。网页在http://localhost:8080/web/page,登录页面在http://localhost:8080/security/login,相同的服务器和端口,但不同的路径。但是我的设置中的某些内容导致安全登录页面的实际服务器和端口被网关服务器和端口替换,我需要它停止这样做。
有什么想法吗?
【问题讨论】:
-
我假设您展示的配置方法是针对安全服务的……网关的安全配置是什么?网络应用程序?你能显示你的路线吗?当您点击 8080/web/page 时会点击网关安全配置,然后路由到网络应用程序,点击该配置......我认为您提供的配置不会涉及。
-
我将一起举一个例子来说明这个问题。我不认为这是必要的。指定“/security/login”的安全配置部分我希望转发到 localhost:8080/security/login 而不是 173.7.8.9:8081/security/login。我会拼凑一个简单的演示并将其放在 github 上。
-
你可以在这里看到一个例子:github.com/scottellis64/micro
-
该项目的自述文件描述了项目的布局,这比我上面描述的要简单一些。示例项目中,只有登录页面的端口号错误,唯一的安全配置是web应用程序的安全配置。克隆并自己尝试应该很容易。我非常感谢任何人可以提供的任何见解。这是我提议推进的大型项目的最后一个绊脚石。
标签: spring-boot spring-security netflix-zuul