2

J'ai une Angular 4 SPA (application d'une seule page) desservie par un serveur sur lequel est installé ColdFusion 11. J'utilise, via les appels AJAX, de nombreuses fonctions contenues dans les fichiers .CFC sur ce serveur ColdFusion.Comment utiliser ColdFusion Session Management avec une application de page unique?

Je veux ce qui suit pour se produire:

L'utilisateur va à mon angulaire 4 Page d'application (myapp.mydomain.com) et sera redirigé vers l'écran de connexion (myapp.mydomain.com/login) où ils entrera leur nom d'utilisateur et mot de passe. L'application Angular 4 appellera alors un .CFC sur le serveur pour valider leurs informations de connexion. Le .CFC retournera un "oui" ou un "non" validant l'information. Ensuite, l'application Angular 4 les redirige vers myapp.mydomain.com/home (ou partout où je veux qu'ils aillent).

Dans le même temps, je souhaite que ColdFusion crée une nouvelle session pour cet utilisateur. Ainsi, si la session expire ou que l'utilisateur se déconnecte, tous les autres appels à d'autres .CFC seront rejetés.

ET si la session ColdFusion expire, je également souhaite que l'application Angular 4 le remarque et redirige l'utilisateur vers la route/login. Fondamentalement, j'ai besoin de sécuriser le côté client (en utilisant un service de type Auth-Guard dans Angular 4, que je sais comment faire) et le côté serveur (en utilisant ColdFusion 11 Session Management, que je ne sais pas savoir comment faire), et je besoin d'eux de communiquer en permanence sur l'état d'autorisation des deux, sans avoir à demander toussimpletemps si oui ou non la session est toujours valide. (L'application Angular 4 peut-elle lire en quelque sorte les cookies de session ColdFusion?)

Comment puis-je faire en sorte que ces deux choses coopèrent entre elles? Ou est-ce que mon ignorance de la gestion de session de ColdFusion m'incite à trouver une solution bien meilleure à laquelle je n'ai pas encore pensé?

Toutes les suggestions sont appréciées. Merci!

+0

Je sais plus sur le côté coldfusion que sur le côté angulaire (comme dans, je n'ai même jamais regardé angulaire). Essayer de comprendre le problème cependant ... toutes vos demandes d'ajax sont au serveur de coldfusion, droit? Donc, vous commencez toutes les fonctions cfc accessibles à distance avec 'if (! IsDefined (" session.user ")) return {un objet que votre client reconnaîtra comme un timeout de session};' et lorsque le client reçoit cet objet en réponse, il définit son propre état interne sur "non authentifié" .Pourquoi cela ne fonctionne-t-il pas? –

+0

Ok - c'est logique, mais comment définir "session.user" à définir? Je ne sais pas très bien comment faire pour créer une session ColdFusion quand je n'utilise aucun fichier .CFM ... Honnêtement, je ne sais pas. t même savoir si ColdFusion * peut * faire cela La documentation pour Application.cfc est très peu claire sur ce front Et ColdFusion ne crée-t-il pas de cookies dans le navigateur quand il crée une session? N'aurais-je pas besoin de manipuler ces Comment puis-je faire en sorte que mon appli Angular 4 accède aux cookies de ColdFusion, ou est-ce que je dois la faire faire? Je vous remercie de votre réponse –

+0

documenta tion laisse beaucoup de choses floues. Je vais essayer de tracer le flux de base de la gestion de session dans une réponse ... –

Répondre

0

Sur le serveur, CFCs ne sont pas exemptés de la création de session automatique et la gestion des cookies

Pour une demande d'accès à des variables de session, ces conditions doivent être remplies:

  • Le client doit faites une demande qui est acheminée vers ColdFusion (c'est-à-dire qu'elle atteint un cfc ou cfm, pas un code HTML statique ou js).
  • Il doit y avoir un Application.cfc dans le même répertoire ou un répertoire ancêtre de celui où se trouve le cfm/cfc demandé.
  • Le Application.cfc doit permettre aux variables de session avec this.sessionmanagement = true;

Lorsque ces conditions sont remplies, ColdFusion associera la demande à une session. Il existe 3 façons cette association peut me fait:

  • Le client a déjà des cookies de session valides et les envoie dans la demande. Votre code CFML peut lire les variables de session créées dans les demandes précédentes et définir de nouvelles valeurs pour les futures requêtes à lire.
  • Le client est nouveau et n'a pas de cookies. ColdFusion crée un nouvel ensemble de cookies et une nouvelle portée de session. Votre code CFML peut définir des variables de session pour les futures requêtes à lire. Les nouveaux cookies sont automatiquement envoyés au client avec votre réponse.
  • Le client envoie des cookies, mais ils correspondent à une session expirée. Ceci est géré comme le cas précédent. De nouveaux cookies sont envoyés et il existe une portée de session vide que votre CFML doit remplir.

Sur le client, les demandes ajax ne sont pas exempts de biscuits, soit

Le XMLHttpRequest sous-jacente obtient et définit les cookies dans le même magasin de cookies que toutes les autres demandes. Si l'URL demandée correspond au domaine, au chemin, à l'indicateur sécurisé d'un cookie, XMLHttpRequest enverra le cookie. Et s'il obtient des cookies valides en réponse, il les ajoutera.

La plupart du temps, vous les variables utilisent simplement la session sans réfléchir sur les cookies ou comment ils sont arrivés là

Donc, pour votre cas d'utilisation, si votre page login est acheminé en interne à login.cfm, et il y a une Application.cfc à proximité, la portée de la session est prêt pour que vous utilisiez dès que login.cfm commence. Vous pouvez faire

if(IsDefined("form.username") && IsDefined("form.password")) { 
    if(...check password [aka the hard part]...) { 
    session.user = form.username; 
    location(url="/home"); 
    } else { 
    location(url="/login"); 
    } 
} else { 
    ...print the login form... 
} 

Et votre code logout peut StructDelete(session, "user")

Partout ailleurs, dans toutes vos la question de savoir si la demande d « s et cfm », cfc est venu d'un utilisateur connecté est simple: Si le client s'est déjà connecté et que la session n'a pas expiré, il existe session.user. Sinon, ce n'est pas le cas (vous aurez une session - il y a toujours une session parce que ColdFusion en crée une avant d'exécuter votre code CFML - mais il n'y aura pas de variable user jusqu'à ce que vous en mettiez une).

Vous pouvez définir d'autres variables utilisateur dans la demande de connexion (et les désactiver lors de la déconnexion), comme le vrai nom, les préférences, tout ce que vous voulez charger à partir d'une base de données fréquemment utilisée et rarement mise à jour. rester dans la portée de la session. En outre, il y a cflogin qui est censé aider à gérer les connexions des utilisateurs, mais cela semble plutôt inutile. (Voir Why don't people use <CFLOGIN>?)

Votre désir d'éviter de devoir "demander à chaque fois" n'est pas vraiment satisfait, mais le "demander" est minime. Le client envoie les cookies dans chaque requête ajax, ce qui "demande" effectivement que la session se poursuive. Et il doit vérifier chaque réponse ajax pour l'erreur "session timeout". Et sur le serveur, chaque fonction de traitement des requêtes doit commencer par vérifier l'existence d'une variable de session.

Mais vous pouvez utiliser un wrapper ajax sur le client pour soulager la douleur.

Sur le serveur, vous pouvez utiliser un onRequestStart pour fournir un «pré-contrôle» commun à toutes les demandes, de sorte que vous n'avez même pas besoin de if(...no user...) { return "OH NO"; } en haut de chaque fonction.

+0

Il semble que l'appel d'une fonction dans un fichier "login.cfc" fonctionnera de la même manière que l'utilisation d'un fichier "login.cfm" pour servir une page de connexion, oui? Donc, il semble que tout ce que vous avez écrit ci-dessus devrait fonctionner pour moi. Je peux juste mettre le nom de l'utilisateur dans la variable "session.user" dans ma fonction de connexion dans mon fichier login.cfm, et il sera stocké dans la portée de session pour chaque appel ultérieur à un CFC situé dans la structure de dossier qui contient mon Fichier Application.cfc. Merci beaucoup d'avoir compris tout ça! J'étais à bout de souffle! Je me suis cogné la tête contre le mur pendant deux semaines maintenant. :-) –