2009-04-03 6 views
3

Si j'ai plusieurs serveurs CF8, un utilisateur peut-il se connecter sur un serveur, mais partager les informations de connexion entre tous les serveurs (pas de re-connexion nécessaire)?Partager les informations de connexion entre les serveurs ColdFusion?

+0

Pouvez-vous ajouter plus de détails - avez-vous une quelconque forme de configuration de cluster ou ces applications sont-elles entièrement séparées? –

Répondre

7

Peut-être que la question concerne le partage de session? Cela peut être fait en utilisant J2EE sessions sérialisé ou en utilisant partagé client variables.

Par exemple, ceci peut être fait de la manière suivante.

Créer une base de données vide sur l'un des serveurs (j'ai créé MySQL). Créez des sources de données pointant vers cette base de données sur tous les serveurs CF. Utilisez cette source de données sous Paramètres du serveur> Variables client> Stockage des sessions client avec le nom SharedSessions (nous l'utiliserons plus tard).

Si nous utilisons cflogin dans Application.cfm sur tous les serveurs , son code peut regarder ce (simplifié) façon:

<cfapplication 
    name="shared_session_test" 
    sessionManagement="true" 
    clientmanagement="true" 
    clientstorage="SharedSessions" /> 

<cflogin> 

    <cfif IsDefined("cflogin") and cflogin.name eq "admin" and cflogin.password eq "admin"> 
     <cfset user_roles = "administrators" /> 
     <cfset user_name = cflogin.name /> 
     <cfset user_password = cflogin.password /> 
    </cfif> 

    <cfif IsDefined("user_roles")> 
     <!--- push login params into shared client scope ---> 
     <cfset CLIENT.user_roles = user_roles /> 
     <cfset CLIENT.user_name = user_name /> 
     <cfset CLIENT.user_password = user_password /> 
    <cfelseif IsDefined("CLIENT.user_roles")> 
     <!--- restore login params from shared client scope ---> 
     <cfset user_roles = CLIENT.user_roles /> 
     <cfset user_name = CLIENT.user_name /> 
     <cfset user_password = CLIENT.user_password /> 
    </cfif> 

    <cfif IsDefined("user_roles")> 
     <cfloginuser name="#user_name#" password="#user_password#" roles="#user_roles#"> 
    <cfelse> 
     <!--- authentication failed - send back 401 ---> 
     <cfsetting enablecfoutputonly="yes" showdebugoutput="no"> 
     <cfheader statuscode="401"> 
     <cfheader name="WWW-Authenticate" value="Basic realm=""MySecurity"""> 
     <cfoutput>Not authorized</cfoutput> 
     <cfabort /> 
    </cfif> 

</cflogin> 

<cfoutput><p><a href="http://other.server.com/index.cfm?#CLIENT.urltoken#">other.server.com</a></p></cfoutput> 

Maintenant, adoptent le même sur les deux serveurs:

<cfdump var="#getAuthUser()#"> 
<cfdump var="#CLIENT#"> 

Bien sûr, il y a beaucoup à faire ici pour améliorer le processus et le rendre plus sûr, il suffit de décrire l'idée générale.

Espérons que cela aide.

+1

était un excellent et très propre écrire. +1 – rip747

+0

Cette solution ne fonctionne que lorsque les deux instances CF sont sous le même serveur ou en cluster, n'est-ce pas? – Henry

+0

@Henry J'ai utilisé cette solution pour différents serveurs. Encore plus, l'un d'entre eux était sur Linux, l'autre sur Win3k. Le DSN partagé était gagnant, donc un autre doit avoir (assez rapidement) accès, disons être dans le même centre de données. Havent essayé en cluster, désolé. – Sergii