Frage

Was ist der einfachste Weg, mehrere Logins in cf verhindern?

<cfcomponent>
<cfset This.name = "Name">

<cfset This.Sessionmanagement="True">
<cfset This.loginstorage="session">
<cfset This.sessionTimeout = "#CreateTimeSpan(0, 0, 50, 0)#"> 
<cfset This.applicationtimeout="#createtimespan(0,0,50,0)#">
<cfset This.scriptProtect = "All">

<cffunction name="OnRequestStart">
    <cfargument name = "request" required="true"/>

    <cfif IsDefined("Form.logout")> 

        <cflogout>

        <cfset StructClear(Session)>

        <cflocation url="/" addtoken="no">

    </cfif>

    <cflogin>
        <cfif NOT IsDefined("cflogin")>
            <cfinclude template="loginform.cfm">
            <cfabort>


        <cfelse>
            <cfif cflogin.name IS "" OR cflogin.password IS "">
                <cfoutput>
                    You must enter text in both the User Name and Password fields.
                </cfoutput>
                <cfinclude template="loginform.cfm">
                <cfabort>
            <cfelse>
                <cfquery name="loginQuery" dataSource="datadsn">
                SELECT *
                FROM userlogin
                WHERE
                UserID = <cfqueryparam value="#cflogin.name#" cfsqltype="CF_SQL_VARCHAR"> 
                AND Password = <cfqueryparam value="#hash(cflogin.password)#" cfsqltype="CF_SQL_VARCHAR">
                AND trenabled = <cfqueryparam value="1" cfsqltype="CF_SQL_VARCHAR">
<!--- Project ID--->
                AND projectid = <cfqueryparam value="23" cfsqltype="CF_SQL_VARCHAR">
                </cfquery>

                <cfset loginpass = #hash(cflogin.password)#>

                <cfset comparison = Compare(loginQuery.Password, loginpass)>

                <cfif loginQuery.trRoles NEQ "" AND comparison EQ 0>

                <cfloginuser name="#cflogin.name#" Password = "#loginpass#" roles="#loginQuery.trRoles#">

                <cfelse>
                    <cfoutput>
                        Your login information is not valid.<br>
                        Please Try again.
                    </cfoutput>    
                    <cfinclude template="loginform.cfm">
                    <cfabort>
                </cfif>
            </cfif>    
        </cfif>
    </cflogin>

    <cfif GetAuthUser() NEQ "">
        <cfoutput>
             <form method="Post">
                <input type="submit" Name="Logout" value="Logout">
            </form>
        </cfoutput>

    </cfif>

</cffunction>

<cffunction name="onSessionEnd" returnType="void">


</cffunction>

</cfcomponent>
War es hilfreich?

Lösung

Wo ich arbeite, sie haben strenge Anforderungen über die Anzahl der Anmeldungen von einem einzelnen Benutzer zu einer einzigen Anwendung zu beschränken. Ich näherte mich dieses Problem dies wie folgt aus:

1) Haben Sie eine Benutzer-Login-Tabelle, die die Benutzerinformationen und ein Feld besagt, dass „letzte Änderung“ und „Gespeichert in“ bezeichnet. Wenn sich der Benutzer anmeldet in der „letzten Aktualisierung“ mit der aktuellen Uhrzeit Datum und den „Login“ mit einem 1. Dadurch wird verhindert, dass Benutzer von der Protokollierung wieder an.

2) Erstellen Sie eine Jquery Ajax-Aufruf das Datenbankfeld „last update“ mit einer neuen Zeit Datumsstempel zu aktualisieren. Dies geschieht nach einem Zeitplan (wie alle 1 min).

3) Das Letzte, was ich tun musste, war Zeitplan eine Aufgabe, falls letztes Update für aktive Anmeldungen sehen geprüft (in der Datenbank) war größer als ein fester Zeitraum, wenn es, dass die Nutzer sind „Gespeichert in“ Status war geändert von 1 auf 0 (so dass sie sich wieder anmelden). Der Grund, warum dies wichtig ist, dass Sie nicht der Benutzer immer „Logout“ annehmen können, wird klicken, wenn sie zu verlassen. Manchmal sie nur in der Nähe ihres Browsers oder verlässt. Wenn dies geschieht, wenn sie wieder an die Anwendung zu kommen versucht, würden sie nicht in der Lage sein, sich wieder anmelden (da die Datenbank denkt sie bereits angemeldet).

Hope Diese bekommt man in der richtigen Richtung gehen.

Andere Tipps

Der einfachste Weg, fand ich, dies zu tun ist in den darunter liegenden Java-Sitzungsbereich in Coldfusion und sucht eine bestehende Login für den einen binden Sie haben.

Wenn es sie gibt, kick out / verfallen die andere Sitzung und lassen Sie die aktuelle in.

Hier ist ein Beispiel aus meinem Code. Zu beachten ist, dass es verschiedene Möglichkeiten, zu töten / beenden eine Sitzung jeden mit ihren eigenen Vor / Nachteilen. Dieses Beispiel war für eine geerbte Code-Basis.

getLogin.fld_userid ist, was der Login-Versuch-ID aus dem HTML-Formular ist.

Ich habe diesen Code läuft während „bei der Anmeldung“, bevor ich die Session-Variablen zu initialisieren.

<!---code for 1user per login  --->  
<cfset liveSessions = createObject("java","coldfusion.runtime.SessionTracker")>
<cfset activesessions = liveSessions.getSessionCollection(YOUR_DATA_SOURCE_NAME)>

<cfloop item="loopSession" collection="#activesessions#">
  <cfscript>
    thisSession = activesessions[loopSession];

    if(StructIsEmpty(thisSession)) {
      // do nothing
    } else {
      if(isDefined("thisSession.loginUserid")) {
        thisUser = thisSession.loginuserid;
        if(thisSession.loginuserid EQ getlogin.fldUser_ID) {
          thisSession.XXAutoToken="";
          //structClear(thisSession);
          //cflocation(theUrl:"index.cfm?home.welcome");
          thisSession.setMaxInactiveInterval(1);
          break;
        }
      }
    }
  </cfscript>
</cfloop>

Basierend auf Jas'z Antwort :

würde ich aus ihrer Antwort annimmt, dass die kommentierten Techniken nicht erreicht haben, was sie zu der Zeit gewünscht wird (2010).

Per einigen googeln, die Session-Methode (von dem zugrunde liegenden Java) setMaxInactiveInterval möglicherweise nicht mehr (wie es scheint Lucee 5 und MySQL-Datenbank für Sitzungsspeicher verwenden)

Ich habe versucht, viele Dinge, die Sitzung, wie structClear zu löschen, um die Sitzung zu {} Einstellung, um die Sitzung zu den nackten Eigenschaften {cfid, cftoken...} Einstellung, und keines dieser gearbeitet.

Das einzige, was funktioniert hat einstellte oder Ändern einzelner Eigenschaften der Sitzung, wie thisSession.loggedIn.

Anwendungen für diese umfassen könnte damit die Benutzer zu sehen und zu steuern, wo sonst sie angemeldet sind.

<cfscript>
  liveSessions = createObject("java","coldfusion.runtime.SessionTracker");
  activeSessions = liveSessions.getSessionCollection(application.applicationName);

  for (s in activeSessions) {
    thisSession = activeSessions[s];

    if (!StructIsEmpty(thisSession)) {
      // Change loggedIn to whatever property identifies a login.
      if (isDefined("thisSession.loggedIn") && thisSession.loggedIn &&
        thisSession.UserID == form.UserID) {
        // Change the UserID line above to whatever match you're looking for
        if(thisSession.UserID == form.UserID) {
          // Change loggedIn to whatever property identifies a login.
          lock scope="session" timeout="5" {
            thisSession.loggedIn = 0;
          }
          break;
        }
      }
    }
  }
</cfscript>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top