Вопрос

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

Решение

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

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

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

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

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

Другие советы

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

Если это там, выгнать / истекающую другую сессию и позвольте текущему в.

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

getLogin.fld_userid - это то, что попытка входа в систему находится из форма HTML.

У меня есть этот код во время «на логине», прежде чем инициализировать переменные сеанса.

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

Основанный на Ответ Джаса:

Я бы предположил из их ответа, что прокомментированные методы не достигли того, чего они желали в то время (2010).

Согласно некоторому поиску в Google, метод session (из базовой java) setMaxInactiveInterval может больше не работать (как представляется, с использованием Lucee 5 и базы данных MySQL для хранения сеансов)

Я перепробовал много способов очистить сеанс, таких как structClear, устанавливая сеанс в {}, устанавливая для сеанса значение " голые свойства" {cfid, cftoken...}, и ни одно из них не сработало.

Единственное, что сработало, - это установка или изменение отдельных свойств сеанса, таких как thisSession.loggedIn.

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

<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>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top