更新会话变量是否会将用户踢到登录页面



我正在开发新的应用程序,并使用会话变量来存储一些用户信息,如电子邮件、权限级别等。我想知道一旦用户决定更新,比如说电子邮件或权限,这不会立即影响他们自己。会话变量只有在注销然后再次登录时才会更新。我知道避免这种情况的一种方法是更新现有的会话变量。以下是我在用户登录时在会话变量中设置的代码示例:

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

如果出于某种原因,您需要保留结构键的大小写,则可以使用数组样式的语法,例如:

<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。账户信息。你可以在那里创建它

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

确保任何被覆盖的变量都是这样的。这是不使用相同的变量名处理不同事物的主要原因之一。当你试图调试时,意外的重写会让你抓狂。

最新更新