相关疑难解决方法(0)

每个微服务都应该管理自己的用户权限和用户角色吗?

我有一个设计问题,不确定如何解决。

假设我的主要应用程序包含6个模块:

  • 客户
  • 网关
  • 认证服务
  • 论坛
  • 画廊
  • 讯息

客户端应该只与网关服务通信。

我是否应该让网关进行用户身份验证(理想情况下会导致JWT)和其他3种生产服务(论坛,画廊,消息)仅验证令牌并检索给定用户自己管理的权限和角色?

为了说明我的一些麻烦,我创建了一个时序图: 此图显示了序列图,我遇到了麻烦

如果愿意,请单击此处获取原始的draw.io图形。

我不想使用任何第三方身份验证服务;我只希望我的身份验证服务(已完成)注册用户并让他们登录。还是应该在该服务中管理权限和角色?

我花了几个月的时间来解决这个问题,但是我根本找不到合适的结构,因此我可以让用户注册,登录/注销并与各种生产性服务进行通信。我目前正在使用Java作为后端工具,但是关于微服务的好处是,我不必全部使用一种编程语言。

欢迎任何帮助!

附:我阅读了微服务认证策略Zuul-Api网关认证,但是这两种方法似乎都不适用。

jwt microservices

7
推荐指数
2
解决办法
2351
查看次数

会话未使用Spring Boot,Session和Redis在会话创建时复制

我正在尝试使用Spring Cloud的Zuul,Eureka和我自己的服务来实现微服务架构.我有多个具有UI和服务的服务,每个服务都可以使用x509安全性对用户进行身份验证.现在我正试图将Zuul放在这些服务面前.由于Zuul无法将客户端证书转发到后端,我认为下一个最好的方法是在Zuul的前门验证用户身份,然后使用Spring Session在后端服务中复制其身份验证状态.我已经按照Dave Syer 的教程进行了操作,它几乎可以工作,但不是第一次请求.这是我的基本设置:

  • Zuul Proxy在它自己的应用程序集中路由到后端服务.是否已启用Spring安全性以执行x509身份验证.成功授权用户.还有@EnableRedisHttpSession的Spring Session
  • 后端服务还启用了弹簧安全性.我已尝试在此处启用/禁用x509,但始终要求用户针对特定端点进行身份验证.还使用Spring Session和@EnableRedisHttpSession.

如果清除所有会话并重新开始并尝试命中代理,则它会使用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)

spring spring-security spring-session spring-cloud

5
推荐指数
1
解决办法
4665
查看次数