Липкая сессия Kubernetes ingress-nginx не работает с Spring Security

У меня есть приложение spring с отслеживанием состояния, и я хочу развернуть его в кластере kubernetes. Будет более одного экземпляра приложения, поэтому мне нужно включить sticy-сессию с помощью контроллера ingress-nginx. Я сделал следующую конфигурацию:

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 перенаправляет последующий запрос на правильный модуль, если вход в систему выполнен успешно. Однако иногда он переключается на другой модуль сразу после изменения JSESSIONID (файл cookie JSESSIONID изменяется с помощью spring-security после успешного входа в систему), и внешний интерфейс перенаправляет обратно на страницу входа, даже если учетные данные пользователя верны. Есть ли кто-нибудь, кто пробовал ingress-nginx с spring-security?

С уважением


person savas    schedule 30.10.2019    source источник


Ответы (2)


После изменения проблема устранена. Без определения хоста в правилах 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
person savas    schedule 30.10.2019
comment
Это то, что спасло нас. хозяин должен быть голым - person Allahbaksh Asadullah; 20.04.2020

Причина, по которой spring изменяет файл cookie, заключается в том, чтобы предотвратить фиксацию сеанса (дополнительную информацию можно найти здесь: https://www.owasp.org/index.php/Session_fixation). В вашем случае вы используете тот же файл cookie для политики липкой маршрутизации, которая используется Spring для обработки сеанса.

Я предлагаю использовать другое имя файла cookie — он будет создан nginx, и нет необходимости использовать файл cookie, который используется приложением.

person Thomas    schedule 30.10.2019
comment
Я пытался использовать маршрут как имя файла cookie, но nginx не установил его. Я использую jboss в качестве сервера приложений. Нужно ли настраивать его на сервере приложений? - person savas; 30.10.2019