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

Session 更新会话变量是否会将用户踢到登录页面?,session,authentication,coldfusion,session-scope,userinfo,Session,Authentication,Coldfusion,Session Scope,Userinfo,我正在开发新的应用程序,并使用会话变量来存储一些用户信息,如电子邮件、权限级别等。我想知道,一旦用户决定更新,比如说电子邮件或他们自己的权限,这些都不会立即影响。会话变量只有在注销然后再次登录时才会更新。我知道避免这种情况的一种方法是更新现有的会话变量。下面是我在用户登录时在会话变量中设置的代码示例: <cfset local.appStruct = structNew()> <cfset structInsert(local.appStruct, "SysAdmin", ch

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

<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
正在存储临时密码,我不需要更新,因为一旦用户设置了新密码,就会自动将其移动到登录页面。在他们更新
电子邮件
访问类型
的其他情况下,我不确定是否应该注销用户或尝试更新会话范围?这样做有没有安全风险?我只是想在我的应用程序中实现最佳实践。多谢各位

从用户的角度来看,必须注销并再次登录听起来不太理想

我建议在用户更新其电子邮件或其他值时更新会话范围。 这与要求用户注销并再次登录在安全性上应该没有区别

在页面上,用户更新其电子邮件,在更新数据库中的值后,只需覆盖会话变量,例如:

<cfset SESSION.AccountInfo.Email = form.email>
<cfset SESSION.AccessLevel = "SOME_NEW_ACCESS_LEVEL">
etc...
如果出于某种原因,需要保留结构键的大小写,可以使用数组样式语法,例如:

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


您可以使用
这不是一个答案,而是关于如何简化结构创建的注释

正如我在对@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。您可以在那里创建它。


SESSION.AccountInfo={
“系统管理员”:checkUser.SystemAdmin,
“用户名”:checkUser.UserName,
“AccountID”:checkUser.AccountID,
“Email”:选中user.Email,
“TempPW”:检查user.TempPW密码,
“AccessType”:permissionType,
“访问级别”:许可级别,
“访问列表”:许可列表
}

确保所有被覆盖的变量都是这样的。这是不为不同的事情使用相同变量名的主要原因之一。当您尝试调试时,意外的覆盖将使您完全发疯。

因此,您建议不要使用
structUpdate()
点表示法并覆盖以前的值?附带说明,我可以很简单地更新
用户名
电子邮件
权限类型
权限级别
,但更新
权限列表
并不是那么简单,因为我是在用户登录后创建的。此过程需要在权限上循环,并根据凭据在特定组中设置权限。不管怎样,谢谢你的帮助。啊,好吧,祝你好运!您是否可以将该PermissionList逻辑移动到CFC,以便可以调用诸如
之类的函数??而且,我可能误解了您的问题,但由于登录时设置了
SESSION.AccountInfo.PermissionList
,因此当您更新
SESSION.AccountInfo.Email
,它仍然存在,如果我误解了,很抱歉。它仍然存在,但我要说的是,如果用户更新其权限,我必须比较它们是否不同,然后构建新列表并分配给会话范围。或者您还可以保存更多键入并使用
。我的建议是使用cfscript语法,因为这是新开发的。做很多事情要容易得多。不相关,但通常不会在会话变量中存储密码(任何密码)。@Ageax它不是实际密码,只是标记1或0。使用临时密码的用户将被迫更改密码并再次登录。哦,好的,很好:)我通常使用IsSomething或HassSomething命名布尔变量,因此类型很清楚,但这只是偏好的问题。感谢提供示例。我对您在上一篇关于覆盖变量的评论中试图解释的内容有点困惑……如果您有
SESSION.AccountInfo.email
,然后创建
local.appStruct.email
,并将
appStruct
复制到
SESSION.AccountInfo
,您将使用
local.appStruct.email
覆盖
SESSION.AccountInfo.email
。一些较短结构创建@Shawn的出色演示!
<cfdump var="#local.appStruct#" />
<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 = {
    "SysAdmin"    : checkUser.SystemAdmin ,
    "UserName"    : checkUser.UserName ,
    "AccountID"   : checkUser.AccountID ,
    "Email"       : checkUser.Email ,  
    "TempPW"      : checkUser.TempPassword ,
    "AccessType"  : permissionType ,
    "AccessLevel" : permissionLevel ,
    "AccessList"  : permissionList
  }
</cfscript>