2009-04-03 24 views
3

Wenn ich mehrere CF8-Server habe, kann sich ein Benutzer auf einem Server anmelden, aber die Anmeldedaten auf allen Servern teilen (keine erneute Anmeldung erforderlich)?Anmeldedaten zwischen ColdFusion-Servern teilen?

+0

Können Sie weitere Details hinzufügen - haben Sie irgendeine Form von Cluster-Setup oder sind das völlig separate Anwendungen? –

Antwort

7

Vielleicht ist Frage zum Teilen der Sitzung? Dies kann unter Verwendung der Seriennummer J2EE sessions oder unter Verwendung der gemeinsamen client variables erfolgen.

Zum Beispiel kann dies auf folgende Weise getan werden.

Erstellen Sie eine leere Datenbank auf einem der Server (ich habe MySQL erstellt). Erstellen Sie auf allen CF-Servern Datenquellen, die auf diese Datenbank verweisen. Verwenden Sie diese Datenquelle als Servereinstellungen> Clientvariablen> Clientsitzungsspeicher mit dem Namen SharedSessions (wir werden es später verwenden).

Wenn wir cflogin in Application.cfm auf allen Servern verwenden sind, ist es Code, um diese (vereinfacht) so aussehen kann:

<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> 

Und dies gleich zeigen auf beiden Servern:

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

Sicher, es gibt viel zu tun, um den Prozess besser und sicherer zu machen, nur die allgemeine Idee beschrieben.

Hoffe, das hilft.

+1

Das war ein ausgezeichnetes und sehr sauberes Schreiben. +1 – rip747

+0

Diese Lösung funktioniert nur, wenn beide CF-Instanzen unter dem gleichen Server oder gruppiert sind, oder? – Henry

+0

@Henry Ich habe diese Lösung für verschiedene Server verwendet. Mehr noch, einer von ihnen war auf Linux-Box, andere auf Win3k. Shared DSN war auf Win One, also muss noch ein anderer (so schnell wie möglich) darauf zugreifen, sagen wir, dass wir im selben Datacenter sein werden. Havent versuchte zusammengedrängt, sorry. – Sergii

Verwandte Themen