我有一个设计问题,不确定如何解决。
假设我的主要应用程序包含6个模块:
客户端应该只与网关服务通信。
我是否应该让网关进行用户身份验证(理想情况下会导致JWT)和其他3种生产服务(论坛,画廊,消息)仅验证令牌并检索给定用户自己管理的权限和角色?
如果愿意,请单击此处获取原始的draw.io图形。
我不想使用任何第三方身份验证服务;我只希望我的身份验证服务(已完成)注册用户并让他们登录。还是应该在该服务中管理权限和角色?
我花了几个月的时间来解决这个问题,但是我根本找不到合适的结构,因此我可以让用户注册,登录/注销并与各种生产性服务进行通信。我目前正在使用Java作为后端工具,但是关于微服务的好处是,我不必全部使用一种编程语言。
欢迎任何帮助!
附:我阅读了微服务认证策略和Zuul-Api网关认证,但是这两种方法似乎都不适用。
我正在尝试使用Spring Cloud的Zuul,Eureka和我自己的服务来实现微服务架构.我有多个具有UI和服务的服务,每个服务都可以使用x509安全性对用户进行身份验证.现在我正试图将Zuul放在这些服务面前.由于Zuul无法将客户端证书转发到后端,我认为下一个最好的方法是在Zuul的前门验证用户身份,然后使用Spring Session在后端服务中复制其身份验证状态.我已经按照Dave Syer 的教程进行了操作,它几乎可以工作,但不是第一次请求.这是我的基本设置:
如果清除所有会话并重新开始并尝试命中代理,则它会使用zuul服务器的证书将请求发送到后端.然后,后端服务根据该用户证书查找用户,并认为用户是服务器,而不是在Zuul代理中经过身份验证的用户.如果您只是刷新页面,那么您突然成为后端的正确用户(在Zuul代理中进行身份验证的用户).我正在检查的方法是在后端控制器中打印出Principal用户.所以在第一次请求时,我看到了服务器用户,在第二次请求时,我看到了真实用户.如果我在后端禁用x509,在第一次请求时,我得到403,然后刷新,它让我进去.
看起来会话没有足够快地复制到后端,所以当用户在前端进行身份验证时,它在Zuul转发请求时没有进入后端.
有没有办法保证会话在第一个请求(即会话创建)上被复制?或者我错过了一步以确保其正常工作?
以下是一些重要的代码段:
Zuul代理:
@SpringBootApplication
@Controller
@EnableAutoConfiguration
@EnableZuulProxy
@EnableRedisHttpSession
public class ZuulEdgeServer {
public static void main(String[] args) {
new SpringApplicationBuilder(ZuulEdgeServer.class).web(true).run(args);
}
}
Run Code Online (Sandbox Code Playgroud)
Zuul配置:
info:
component: Zuul Server
endpoints:
restart:
enabled: true
shutdown:
enabled: true
health:
sensitive: false
zuul:
routes:
service1: /**
logging:
level:
ROOT: INFO
# org.springframework.web: DEBUG
net.acesinc: DEBUG
security.sessions: ALWAYS
server:
port: 8443
ssl:
key-store: classpath:dev/localhost.jks
key-store-password: thepassword
keyStoreType: JKS
keyAlias: localhost
clientAuth: want …Run Code Online (Sandbox Code Playgroud)