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>