【问题标题】:Kubernetes ingress-nginx sticky session isn't working with spring securityKubernetes ingress-nginx 粘性会话不适用于 Spring Security
【发布时间】:2020-02-25 20:37:06
【问题描述】:

我有一个有状态的 spring 应用程序,我想将它部署到 kubernetes 集群。该应用程序将有多个实例,因此我需要使用 ingress-nginx 控制器启用 sticy 会话。我做了以下配置:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-nginx
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
    nginx.ingress.kubernetes.io/affinity: "cookie"
    nginx.ingress.kubernetes.io/session-cookie-name: "JSESSIONID"
    nginx.ingress.kubernetes.io/session-cookie-expires: "172800"
    nginx.ingress.kubernetes.io/session-cookie-max-age: "172800"
    nginx.ingress.kubernetes.io/session-cookie-path: /ingress-test
    # UPDATE THIS LINE ABOVE
spec:
  rules:
     - http:
        paths:
          - path: /ingress-test
            backend:
              serviceName: ingress-test
              servicePort: 31080

如果登录成功,ingress-nginx 将后续请求重定向到正确的 pod。但是,它有时会在 JSESSIONID 更改后切换到其他 pod(JSESSIONID cookie 在成功登录后由 spring-security 更改)并且即使用户凭据正确,前端也会重定向回登录页面。有人用 spring-security 尝试过 ingress-nginx 吗?

最好的问候

【问题讨论】:

    标签: spring spring-security kubernetes sticky-session


    【解决方案1】:

    以下更改解决了该问题。如果规则中没有主机定义,ingress-nginx 不会设置会话 cookie。

    有一个未解决的问题:https://github.com/kubernetes/ingress-nginx/issues/3989

    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: ingress-nginx
      annotations:
        kubernetes.io/ingress.class: nginx
        nginx.ingress.kubernetes.io/ssl-redirect: "false"
        nginx.ingress.kubernetes.io/affinity: "cookie"
        nginx.ingress.kubernetes.io/session-cookie-name: "route"
        nginx.ingress.kubernetes.io/session-cookie-expires: "172800"
        nginx.ingress.kubernetes.io/session-cookie-max-age: "172800"
        nginx.ingress.kubernetes.io/session-cookie-path: /ingress-test
        # UPDATE THIS LINE ABOVE
    spec:
      rules:
         - host: www.domainname.com
           http:
            paths:
              - path: /ingress-test
                backend:
                  serviceName: ingress-test
                  servicePort: 31080
    

    【讨论】:

    • 这件事拯救了我们。主人应该是裸体的
    【解决方案2】:

    spring 更改 cookie 的原因是为了防止会话固定(更多信息可以在这里找到:https://www.owasp.org/index.php/Session_fixation)。 在您的情况下,您将相同的 cookie 用于 spring 用于会话处理的粘性路由策略。

    我建议使用不同的 cookie 名称 - 它将由 nginx 创建,无需使用应用程序使用的 cookie。

    【讨论】:

    • 我尝试使用“路由”作为 cookie 名称,但 nginx 没有设置它。我正在使用 jboss 作为应用程序服务器。需要在应用服务器中配置吗?
    【解决方案3】:

    感谢@savas 的见解,我确认我的设置(3 个节点)存在问题。 这个问题也在这个线程中得到了很好的探索:https://github.com/kubernetes/ingress-nginx/issues/1980

    附:我还通过指定路径实现了负载平衡持久性(即会话亲和性)。

    【讨论】:

      猜你喜欢
      • 2019-10-13
      • 2020-08-10
      • 2020-11-07
      • 1970-01-01
      • 2019-11-13
      • 2020-07-02
      • 2020-12-20
      • 2021-08-07
      • 2022-06-12
      相关资源
      最近更新 更多