lumnik. / scénarios Tous les scénarios · English

Une vieille app derrière un login: lumnik se connecte comme un utilisateur

Objectif Lire les vétérinaires de Spring PetClinic, protégé par le login du serveur Tomcat, sans toucher à l'app.

Spring PetClinic d'avant Spring Boot, derrière le login du serveur (j_security_check). Pas de jeton d'API: un formulaire et un cookie de session.

manifests/lab-docker-compose.yml
# The clinic's application: Spring PetClinic of before Spring Boot, a WAR on Tomcat 11, behind the container's FORM login.name: lumnik-legacy-sessionservices:  petclinic:    build: ../run/petclinic    environment:      # Tomcat reads ${...} in its configuration from system properties.      JAVA_OPTS: -DCLINIC_PASSWORD=${CLINIC_PASSWORD:-clinic-lab-password}    ports: ["127.0.0.1:${PETCLINIC_PORT:-9310}:8080"]   # this machine only
manifests/10-vets-no-auth.yaml
apiVersion: connectors.lumnik.io/v1kind: Connectormetadata:  name: scenario-legacy-session-a  connector_type: rest-generic  scopes: [clinic]spec:  base_url: http://host.docker.internal:9310/petclinic  endpoints:    - id: vets      path: /vets.json      method: GET      pagination: { kind: none, response_path: $.vetList }      target:        kind: hybrid        table: ext.scenario_legacy_session_a        unique_key: $.id        promote:          - { name: first_name, path: $.firstName, type: text }          - { name: last_name, path: $.lastName, type: text }
manifests/20-vets-session.yaml
apiVersion: connectors.lumnik.io/v1kind: Connectormetadata:  name: scenario-legacy-session-a  connector_type: rest-generic  scopes: [clinic]spec:  base_url: http://host.docker.internal:9310/petclinic  auth:    kind: session                                       # the container's form login, the session cookie kept    login_url: http://host.docker.internal:9310/petclinic/j_security_check    prime_url: http://host.docker.internal:9310/petclinic/vets.json    username: lumnik    password_env: SCENARIO_CLINIC_A_PASSWORD    username_field: j_username    password_field: j_password  endpoints:    - id: vets      path: /vets.json      method: GET      pagination: { kind: none, response_path: $.vetList }      target:        kind: hybrid        table: ext.scenario_legacy_session_a        unique_key: $.id        promote:          - { name: first_name, path: $.firstName, type: text }          - { name: last_name, path: $.lastName, type: text }
$ lm connector run scenario-legacy-session-a
run scheduled: 45908ea8-e37c-4e46-920f-2a658563c1be

$ lm run get 45908ea8-e37c-4e46-920f-2a658563c1be
ID        CONNECTOR                  ENDPOINT  STATUS     IN  OUT  SKIPPED  DEAD-LETTERS  STARTED           ENDED             EVALUATED
45908ea8  scenario-legacy-session-a  vets      Completed  6   6    0        0             2026-11-02 21:11  2026-11-02 21:11  yes
$ lm connector run scenario-legacy-session-a
run scheduled: ef5e983b-312f-4889-b17f-ddd2218a9379

$ lm run get ef5e983b-312f-4889-b17f-ddd2218a9379
ID        CONNECTOR                  ENDPOINT  STATUS     IN  OUT  SKIPPED  DEAD-LETTERS  STARTED           ENDED             EVALUATED
ef5e983b  scenario-legacy-session-a  vets      Completed  6   6    0        0             2026-11-02 21:11  2026-11-02 21:11  yes

Limites

  • Un formulaire simple: pas de login en JavaScript, pas de second facteur, pas de SAML ni de CAS.
  • Le cookie ne part que vers l'origine du login: un endpoint sur un autre hôte est refusé.
  • Les données de démo de PetClinic: 6 vétérinaires; un mot de passe jetable, tiré à chaque rejeu.

Clinique · vétérinaires

La vieille app de la clinique demande un login.

Il faut lire ses vétérinaires, chaque nuit.

Spring PetClinic derrière le login de Tomcat

Le problème

Pas de jeton d'API.

  • Un formulaire, un mot de passe.
  • Puis un cookie de session.

Ce qui n'est pas modifié

L'app reste telle quelle.

  • Le login est celui du serveur.
  • Le compte est un compte de la clinique.

Sans auth

Le serveur rend sa page de login.

  • En 200, en HTML.
  • Le hub la refuse: ce ne sont pas des données.

Ce qu'il a fallu écrire

auth: { kind: session }

Le hub se connecte comme un utilisateur.

  • 6 vétérinaires.
  • Un connecteur de 30 lignes.

Le redémarrage

L'app redémarre, la session est perdue.

  • Le hub se reconnecte seul, une fois.
  • Le run lit les 6 vétérinaires.

La limite

Un formulaire simple.

  • Pas de login en JavaScript.
  • Pas de second facteur.

Essayer

Le scénario se rejoue en local.

Chaque étape est publiée avec sa sortie.

Ce scénario tourne sur lumnik Open, gratuit et open source.

Essayer lumnik Open →