Domanda

Che cosa è il modo più semplice di prevenire accessi multipli in CF?

<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>
È stato utile?

Soluzione

Dove lavoro che hanno requisiti rigorosi circa la limitazione del numero di accessi da un singolo utente per una singola applicazione. Mi sono avvicinato a questo problema questo in questo modo:

1) Avere una tabella di accesso utente che contiene informazioni utente e un campo che ha chiamato "ultimo aggiornamento" e "Accesso effettuato". Quando l'utente accede al "ultimo aggiornamento" con la data ora corrente, l' "registrati in" con 1. Questo impedisce tale utente di accedere nuovamente.

2) Creazione di una chiamata jquery ajax per aggiornare il campo del database "ultimo aggiornamento" con una nuova data timestamp. Ciò accade su un programma (come ogni 1 min).

3) L'ultima cosa che dovevo fare era programma un compito che controllato per vedere se l'aggiornamento per gli accessi attivi (nel database) è stato maggiore di un determinato periodo di tempo, se fosse stato che gli utenti "loggato" status era cambiato da 1 a 0 (permettendo loro di login di nuovo). Il motivo per cui questo è importante è non si può assumere l'utente sarà sempre cliccare su "Logout" quando se ne vanno. A volte basta chiudere il browser o lontano navigare. Quando questo accade se hanno tentato di tornare alla domanda che non sarebbero in grado di accedere di nuovo (perché il database pensa che vengono registrati nel già).

Spero che questo ti fa andare nella giusta direzione.

Altri suggerimenti

Il modo più semplice che ho trovato per farlo è quello di legare nella sottostante scope di sessione java in ColdFusion e il look per un account di accesso esistente per quello che avete.

Se è lì, calci fuori / scade l'altra sessione e lasciare quello attuale in.

Ecco un esempio dal mio codice. Fare notare che ci sono diversi modi per uccidere / terminare una sessione ognuno con i propri pro / contro. Questo esempio è stato per una base di codice ereditato.

getLogin.fld_userid è ciò che l'ID di accesso tentato è dal modulo HTML.

Ho questo codice eseguito durante "al login" prima di inizializzare le variabili di sessione.

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

In base a Jas'z Risposta :

I assumerebbe dalla loro risposta che le tecniche commentate non hanno raggiunto quello che desideravano al tempo (2010).

Per un po 'googling, il metodo della sessione (dal java sottostante) setMaxInactiveInterval non possono funzionare (come appare usando Lucee 5 e MySQL database per l'archiviazione di sessione)

Ho provato molte cose per cancellare la sessione, ad esempio structClear, l'impostazione della sessione per {}, l'impostazione della sessione per le proprietà nuda {cfid, cftoken...}, e nessuno di questi ha lavorato.

L'unica cosa che ha funzionato è stato impostare o modificare le proprietà individuali della sessione, come thisSession.loggedIn.

usi per questo potrebbe includere consentendo agli utenti di vedere e controllare dove altro si è registrato in.

<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>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top