spring-boot - Spring Boot 微服务中的 JWT 安全性
问题描述
除了最重要的部分外,我有一个非常接近工作的 Spring Boot 应用程序。基本上设置了四个微服务(还有其他几个,但为了这个问题的目的是四个)。
- 服务注册中心:一个 Eureka 服务注册中心
- gateway:一个 Zuul Gateway 服务,所有其他服务都通过它进行通信,
- 安全性:一个简单的服务,有一个登录网页并实现 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,相同的服务器和端口,但路径不同。但是我的设置中的某些东西导致安全登录页面的实际服务器和端口被网关服务器和端口替换,我需要它停止这样做。
有任何想法吗?
解决方案
好的,我想我有它。我更新了我的项目以反映变化。问题是安全配置(正如我认为上面的詹姆斯所指的那样)在 web 模块中。我将它移到网关,以便在转发到登录页面时,端口和服务器保持不变。我仍然可以在我选择的任何模块中转发到登录页面,但必须将安全配置应用于网关本身。
我的示例项目的最新版本现在可以按预期工作:github.com/scottellis64/micro
推荐阅读
- python - 每次切换帧时如何在 tkinter 中重新加载帧?
- python - 当我更改项目路径时,Virtualenv 不再工作
- python - Python单元测试assertEqual在一台机器上抛出assertionError但在其他机器上没有
- python - Gitlab CI/CD 缓存清理机制
- django - 为 Celery worker 使用 Django 的自动重载,某些文件的更改不会触发自动重载
- c# - 无法解释的空引用异常行为
- javascript - 带有setTimeout的for循环?
- python - 在python中以均匀分布顺序生成随机数(X1,X2,X3)
- java - 如何使用 Curator TestingServer 启动 zookeeper ensemble
- python-3.x - 编写函数体