Pregunta

¿Cuál es la forma más fácil de prevenir múltiples inicios de sesión en la FQ?

<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>
¿Fue útil?

Solución

donde trabajo que tienen requisitos estrictos sobre la limitación del número de inicios de sesión por un solo usuario a una única aplicación. Me acerqué a este problema esta como esta:

1) Tener una mesa de inicio de sesión de usuario que tiene información de usuario y un campo que llama "última actualización" y "Registro". Cuando el usuario inicia sesión en la "última actualización" con la fecha y hora actuales los "ingresados" con un 1. Así se impide que el usuario se conecte de nuevo.

2) Crear una llamada jQuery Ajax para actualizar el campo de base de datos "última actualización" con un nuevo sello de fecha y hora. Esto ocurre en un horario (como cada 1 min).

3) La última cosa que tenía que hacer era programar una tarea que comprueba para ver si la última actualización para los inicios de sesión activa (en la base de datos) era mayor que un período fijo de tiempo, si era que los usuarios "Identificados" estado era cambiado de 1 a 0 (lo que les permite conectarse de nuevo). La razón por la que esto es importante es que no se puede asumir que el usuario siempre se haga clic en "Salir" cuando se van. A veces sólo cerca de su navegador o navegar lejos. Cuando esto sucede si intentaban volver a la aplicación que no sería capaz de conectarse de nuevo (porque la base de datos cree que se registran en ya).

Espero que esto consigue que va en la dirección correcta.

Otros consejos

La forma más fácil que he encontrado para hacer esto es para atar en el ámbito de la sesión de Java subyacente en ColdFusion y el aspecto de un inicio de sesión existente para la que tienes.

Si está ahí, echar a / expire la otra sesión y dejar que la actual en.

Aquí está un ejemplo de mi código. Ten en cuenta que hay diferentes maneras de matar / finalizar una sesión cada uno con sus propias ventajas / desventajas. Este ejemplo era para una base de código heredado.

getLogin.fld_userid es lo que el ID de inicio de sesión intentado es del formulario HTML.

Tengo este código se ejecutan durante "en la entrada" antes de inicializar las variables de sesión.

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

Jas'z respuesta :

Yo asumiría de su respuesta que las técnicas comentadas no lograron lo que deseaban en el momento (2010).

Per algunas google, el método sesión (desde el java subyacente) setMaxInactiveInterval ya no funcionen (tal como aparece usando Lucee 5 y MySQL base de datos para almacenamiento de sesión)

He intentado muchas cosas para borrar la sesión, como structClear, el establecimiento de la sesión para {}, el establecimiento de la sesión al desnudo propiedades {cfid, cftoken...}, y ninguno de ellos funcionó.

Lo único que hizo el trabajo fue establecer o cambiar las propiedades individuales de la sesión, como thisSession.loggedIn.

Aplicaciones de este podría incluir permitir a los usuarios ver y controlar dónde si no están conectados.

<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>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top