我正在编写一个应用程序,其中包含许多对话框/模态div,允许用户执行各种任务,例如上传图片,发送电子邮件等。
我的应用程序具有基于角色的安全性,因此当您登录时,它会检查您的会话变量以找出您的身份,然后提供相应的功能。
目前,我在页面中拥有所有需要它们的对话框/模态。这意味着如果我想在我的网站的其他地方使用相同的对话框,我必须复制代码并将其放在该页面上。这立刻让我觉得我应该:
imageupload.cfm
和emailsend.cfm
<cfinclude>
包含这些.cfm文件,其中任何页面都要使用它们这个潜在的解决方案给我带来了挑战,因为包含对话框的页面有许多if / else语句,可根据角色(存储在会话变量中)计算出呈现给哪个用户的内容。
所以我必须:
imageupload.cfm
提供的内容将根据您的角色而有所不同user-security.cfc
文件的保护。我是否还必须在每个对话框.cfm页面中进行此调用?如果我这样做,那么将在同一页面中对同一user-security.cfc
文件进行两次调用,因为对话框页面包含在主页面中。但是,如果我不在对话框.cfm中调用user-security.cfc
,那么有人可以直接访问这些页面并开始造成混乱吗?抱歉这不是一个纯粹的编程问题和更多理论上的最佳实践,但我不确定如何在保持可扩展性的同时解决它。我在IIS 7.5上使用ColdFusion 10
答案 0 :(得分:3)
您可以按如下方式增加代码的可重用性。
使用user-security.cfc文件的实例创建应用程序范围变量。在Application.cfc文件的onApplicationStart()方法中执行此操作。像这样:
application.SecurityChecker = CreateObject("component", "user-security");
同样在onApplicationStart()方法中,创建一个不需要进行安全检查的页面列表。
application.SecurityNotNeededPages="page1.cfm,page2.cfm,etc";
在onRequestStart()方法中使用这些变量。
var ThisPage = listlast(cgi.PATH_INFO, "/");
if (ListFindNoCase(application.SecurityNotNeededPages, ThisPage) is false) {
application.SecurityChecker.CheckSecurityMethod(argumentcollection = session);
etc
这将解决人们在未登录时直接浏览包含页面的问题。它还可以使您的应用程序运行得更快,因为您只需创建一次user-security.cfc实例,它就会在每个页面请求中为每个用户提供。
编辑从此处开始
在评论中,Adam Cameron说:“另外,onRequestStart()已经接收了作为参数请求的文件的名称;我认为没有必要使用CGI范围来获取它。”这对我来说是新闻所以我以为我会把它检查出来。
我运行了一个具有此功能的页面。
<cffunction name="onRequestStart" access="public" returntype="boolean">
<cfdump var="#arguments#">
<cfreturn true>
</cffunction>
这给了我一个1的键,值显示了我实际运行的页面的路径。所以,以错误的顺序做事,我读了the docs。遵循这些准则,我将其添加到上面的代码中:
<cfargument name="targetPage" required="yes">
毫不奇怪,转储为TARGETPAGE提供了相同值的密钥。然后我将参数的名称改为“fred”。转储给了我一个具有相同价值的FRED钥匙。
最重要的是,无论您使用发送到页面的参数还是cgi范围,您仍然必须使用ListLast来获取页面的名称。
答案 1 :(得分:1)
创建一个index.cfm页面,主要由一个大的switch语句组成。您的URL是action.subaction,即index.cfm?action = email.send。解析index.cfm中的那个。然后针对每种情况,检查安全规则并根据需要进行cfinclude。但是,你真的需要学习一个框架。 FW / 1会做你想要的,而且很容易学习。我相信Coldbox也有极简主义版本。
答案 2 :(得分:0)
<cfinclude>
适用于任何扩展名的文件。作为标准实践,我将所有包含*.cfi
命名为。
在FW / 1世界中,这特别有用。
我可以使用
目录views/reports/home.cfm
views/reports/details.cfm
views/reports/header.cfi
有效链接包括
index.cfm/reports/home
index.cfm/reports/details
但是
index.cfm/reports/header
什么都不做
这样做可以向其他开发人员传达我打算让文件做什么。