簡體   English   中英

更新會話變量是否將用戶踢入登錄頁面?

[英]Updating session variables kick user to login page or not?

我正在開發新的應用程序,並使用會話變量來存儲一些用戶信息,如電子郵件,權限級別等。我想知道一旦用戶決定更新,讓自己說出電子郵件或權限就不會立即受到影響。 會話變量只有先注銷然后再次登錄,才會更新。 我知道避免這種情況的一種方法是更新現有的會話變量。 這是我在用戶登錄時在會話變量中設置的代碼示例:

<cfset local.appStruct = structNew()>
<cfset structInsert(local.appStruct, "SysAdmin", checkUser.SystemAdmin, true)>
<cfset structInsert(local.appStruct, "UserName", checkUser.UserName, true)>
<cfset structInsert(local.appStruct, "AccountID", checkUser.AccountID, true)>
<cfset structInsert(local.appStruct, "Email", checkUser.Email, true)>
<cfset structInsert(local.appStruct, "TempPW", checkUser.TempPassword, true)>
<cfset structInsert(local.appStruct, "AccessType", permissionType, true)>
<cfset structInsert(local.appStruct, "AccessLevel", permissionLevel, true)>
<cfset structInsert(local.appStruct, "AccessList", permissionList, true)>
<cfset SESSION.AccountInfo = appStruct> 

上面我只顯示了保存在會話范圍內的字段。 所有值均從我未顯示的查詢中提取。 例如, TempPW正在存儲臨時密碼,我不需要更新該密碼,因為一旦用戶設置了新密碼,該用戶便會自動移至登錄頁面。 在其他情況下,他們更新emailaccess type我不確定是否應該注銷用戶或嘗試更新會話范圍? 以一種方式或另一種方式進行操作是否存在安全風險? 我只是在嘗試在我的應用程序中實現最佳實踐。 謝謝。

從用戶的角度來看,必須注銷並再次登錄聽起來不太理想。

我建議在用戶更新其電子郵件或其他值時更新會話范圍。 與要求用戶注銷並再次登錄相比,安全性應該沒有區別。

在頁面上,用戶更新了他們的電子郵件,在您更新數據庫中的值之后,只需覆蓋會話變量即可,例如:

<cfset SESSION.AccountInfo.Email = form.email>
<cfset SESSION.AccessLevel = "SOME_NEW_ACCESS_LEVEL">
etc...

作為附帶建議,我將停止使用structInsert ,您可以簡單地設置變量並避免調用函數的性能開銷(極小)。 您上面的相同代碼可以重寫為:

<cfset local.appStruct = structNew()>
<cfset local.appStruct.SysAdmin = checkUser.SystemAdmin>
<cfset local.appStruct.UserName = checkUser.UserName>
<cfset local.appStruct.AccountID = checkUser.AccountID>
<cfset local.appStruct.Email = checkUser.Email>
<cfset local.appStruct.TempPW = checkUser.TempPassword>
<cfset local.appStruct.AccessType = permissionType>
<cfset local.appStruct.AccessLevel = permissionLevel>
<cfset local.appStruct.AccessList = permissionList>
<cfset SESSION.AccountInfo = appStruct> 

如果由於某種原因需要保留struct鍵的大小寫,則可以使用數組樣式的語法,例如:

<cfset local.appStruct = structNew()>
<cfset local.appStruct["SysAdmin"] = checkUser.SystemAdmin>
<cfset local.appStruct["UserName"] = checkUser.UserName>
<cfset local.appStruct["AccountID"] = checkUser.AccountID>
<cfset local.appStruct["Email"] = checkUser.Email>
<cfset local.appStruct["TempPW"] = checkUser.TempPassword>
<cfset local.appStruct["AccessType"] = permissionType>
<cfset local.appStruct["AccessLevel"] = permissionLevel>
<cfset local.appStruct["AccessList"] = permissionList>
<cfset SESSION.AccountInfo = appStruct> 

您可以使用<cfdump查看兩個結構之間的差異,以及在第一個示例中鍵是如何全部小寫,還是在第二個示例中保留鍵的大/小寫。

<cfdump var="#local.appStruct#" />

抱歉,我可能正在討論話題,希望對您有所幫助。

這不是要作為答案,而應是關於如何簡化Struct創建的注釋。

正如我在@ sqrl0答案的注釋中提到的那樣,可以使用帶有標簽的標簽:

<cfset local.appStruct = {
    "SysAdmin"    : checkUser.SystemAdmin ,
    "UserName"    : checkUser.UserName ,
    "AccountID"   : checkUser.AccountID ,
    "Email"       : checkUser.Email ,
    "TempPW"      : checkUser.TempPassword ,
    "AccessType"  : permissionType ,
    "AccessLevel" : permissionLevel ,
    "AccessList"  : permissionList
}>
<cfset SESSION.AccountInfo = local.appStruct> 

或CFScript: 注意:您無需將結構復制到SESSION.AccountInfo。 您可以在那里創建它。

<cfscript>
  SESSION.AccountInfo = {
    "SysAdmin"    : checkUser.SystemAdmin ,
    "UserName"    : checkUser.UserName ,
    "AccountID"   : checkUser.AccountID ,
    "Email"       : checkUser.Email ,  
    "TempPW"      : checkUser.TempPassword ,
    "AccessType"  : permissionType ,
    "AccessLevel" : permissionLevel ,
    "AccessList"  : permissionList
  }
</cfscript>

確保要覆蓋的所有變量都是這種方式。 這是不將相同的變量名稱用於不同事物的主要原因之一。 當您嘗試調試時,意外的改寫將使您絕對無法自拔。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM