我对ColdFusion非常陌生。我正在构建一个非常基本的系统,如果成功登录,现在需要在其中设置会话变量。但是我不知道如何在ColdFusion中设置会话或如何在应用程序页面上检查会话。
我搜索了解决方案,但找不到令人满意的解决方案。我需要一些示例,其中在登录时设置了会话,并在注销时销毁了会话。
我已经读过Application.cfm
,但是该文件位于何处?
这可能是一个简单的问题,并可能以某些方式重复出现。
谢谢。
答案 0 :(得分:1)
首先您应该使用:
Application.cfc
您可以使用:
OnSessionStart
在这种情况下,您无需锁定会话变量,因为Coldfusion会处理此问题。 如果您在此方法之外设置会话变量,则可能需要锁定该变量,例如:
登录之前:
<cfif NOT StructKeyExists(session,"authenticated")>
<cflock scope="session" timeout="30" type="exclusive">
<cfset session.authenticated = false />
</cflock>
</cfif>
创建新帐户:
用户登录时,请记住使用诸如BCrypt()之类的密码来哈希密码并存储在数据库中。不要加密密码,因为这些密码可能未加密,这可能会造成潜在的安全漏洞。
https://github.com/tonyjunkes/BCryptCFC
<cfset salt = BCrypt.genSalt()>
<cfset hash = BCrypt.hashString("password", salt)>
登录验证:
用户登录后,使用BCrypt()检查明文密码是否与数据库中的密码哈希匹配:
<cfset BCrypt.checkString("password", hash)>
还要检查“用户名” [电子邮件]是否匹配...
如果BCrypt()验证成功,则设置“会话”变量:
<cflock scope="session" timeout="30" type="exclusive">
<cfset session.authenticated = true />
</cflock>
这是登录方式的非常基本的实现,但是它为您提供了入门的思路。
另一个提示是,如果您要锁定“会话”变量,则不必继续使用:
<cflock>
从会话中读取内容时,建议将“ sesssion”变量转换为“ variables”范围,例如:
<cflock scope="session" timeout="10" type="readOnly">
<cfset variables.lckauthenticated = session.authenticated />
</cflock>
然后您可以使用:
variables.lckauthenticated
在<cflock>
标记之外。
现在,关于是否需要锁定“会话”变量存在一些争论,但是我的规则以及Adobe官方文档中建议的一项规则是,如果您正在读写,则锁定“会话”变量。它们在onSessionStart之外。
然后,当您的用户注销时,只需进行设置:
<cflock scope="session" timeout="30" type="exclusive">
<cfset session.authenticated = false />
</cflock>
然后可以使用此标志来确定显示给用户的内容。 我通常会在成功登录期间设置几个“会话”变量,例如:
session.userid
session.roleid
“会话”轮换等其他内容也有助于保护您的会话,但这是另一篇文章的更高级主题...