Запрет одновременных входов в Coldfusion - PullRequest
2 голосов
/ 03 ноября 2010

Какой самый простой способ предотвратить несколько входов в 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>

Ответы [ 2 ]

1 голос
/ 03 ноября 2010

Самый простой способ, который я нашел для этого, - это привязаться к базовой области Java-сессии в ColdFusion и найти существующий логин для того, который у вас есть.

Если он есть, выкинуть / истечь другой сеанс и пропустить текущий.

Вот пример из моего кода. Обратите внимание, что есть разные способы убить / завершить сеанс, каждый со своими плюсами / минусами. Этот пример был для унаследованной кодовой базы.

getLogin.fld_userid - это идентификатор попытки входа из html-формы.

Этот код запускается во время «входа в систему» ​​перед инициализацией переменных сеанса.

<cfset liveSessions = createObject("java","coldfusion.runtime.SessionTracker")>

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

    }

1 голос
/ 03 ноября 2010

Там, где я работаю, предъявляются строгие требования по ограничению количества входов одного пользователя в отдельное приложение.Я подошел к этой проблеме следующим образом:

1) Иметь таблицу входа пользователя, которая содержит информацию о пользователе, и поле, которое называется «последнее обновление» и «Вход в систему».Когда пользователь входит в «последнее обновление» с текущей датой времени и «входит в систему» ​​с 1. Это предотвращает повторный вход этого пользователя.

2) Создайте ajax-вызов jquery для обновленияполе базы данных «последнее обновление» с новой отметкой времени.Это происходит по расписанию (как каждые 1 мин).

3) Последнее, что мне нужно было сделать, - это запланировать задачу, которая проверила, было ли последнее обновление для активных входов в систему (в базе данных) больше, чем фиксированный период времени, если это были пользователи ".msgstr "статус был изменен с 1 на 0 (что позволило им войти снова).Причина, по которой это важно, заключается в том, что вы не можете предполагать, что пользователь всегда будет нажимать кнопку «Выйти», когда он уходит.Иногда они просто закрывают браузер или уходят.Когда это произойдет, если они попытаются вернуться в приложение, они не смогут снова войти в систему (поскольку база данных считает, что они уже вошли в систему).

Надеюсь, это приведет вас в правильном направлении.

...