[英]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
正在存儲臨時密碼,我不需要更新該密碼,因為一旦用戶設置了新密碼,該用戶便會自動移至登錄頁面。 在其他情況下,他們更新email
或access 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.