2010-11-02 65 views
2

防止cf中多次登錄的最簡單方法是什麼?防止在Coldfusion中同時登錄

<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

簡短的回答:使用的應用範圍。長答案:不! – Henry 2010-11-02 23:51:33

回答

1

在我工作的地方,他們對限制單個用戶登錄到單個應用程序的數量有嚴格的要求。我遇到了這樣的問題:

1)有一個用戶登錄表,其中包含用戶信息和一個名爲「last update」和「Logged in」的字段。當用戶使用當前時間日期登錄「最近更新」並使用「登錄」登錄時,這會阻止該用戶再次登錄。

2)創建一個jquery ajax調用,用新的時間日期戳記更新數據庫字段「上次更新」。這發生在一個時間表上(如每1分鐘)。

3)我必須做的最後一件事是安排一個任務,檢查活動登錄的最後更新(在數據庫中)是否大於固定時間段,如果是用戶「登錄」狀態從1更改爲0(允許他們再次登錄)。這一點很重要的原因是你不能假設用戶在他們離開時總是會點擊「註銷」。有時他們只是關閉瀏覽器或走開。當這種情況發生時,如果他們試圖回到應用程序,他們將無法再次登錄(因爲數據庫認爲他們已經登錄)。

希望這能讓你朝着正確的方向前進。

1

我發現這樣做的最簡單方法是綁定到ColdFusion中的基礎java會話作用域中,併爲您擁有的那個尋找現有登錄名。

如果它的存在,踢出/到期的其他會話,並讓當前1英寸

下面是我的代碼的例子。請注意,有不同的方式殺死/結束每個會議都有自己的優點/缺點。這個例子是針對一個繼承的代碼庫。

getLogin.fld_userid是來自html表單的嘗試登錄ID。

我在初始化會話變量之前在「登錄時」運行此代碼。

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

    } 

相關問題