3

我刚开始使用 ColdFusion OOP,我想制作一个 DIV,它根据用户所在的页面和他们拥有的登录权限(角色)向用户显示不同的链接。基本上是一个“上下文”菜单。

我应该将此工具栏/导航 DIV 放在 .cfm 或 .cfc 文件中吗?

重申;cfm 或 cfc 文件需要知道用户在哪个页面上,并且还会检查他们拥有的角色。根据这两条信息,它将向用户显示一组链接。角色信息来自数据库并存储在 SESSION 变量中,为了找出他们所在的页面,我猜它可以使用#GetFileFromPath(GetBaseTemplatePath())#.

我的第一个想法是拥有一个普通的 .cfm 文件,将所有表示和逻辑放入该文件(HTML 和大量<cfif>语句)以确保在 DIV 中显示正确的信息,然后用于<cfinclude>将其显示在页面上。然后我开始考虑也许我应该制作一个自定义标签并要求调用页面传入用户的凭据和#GetFileFromPath(GetBaseTemplatePath())#as 参数,然后让该自定义标签返回所有的展示数据。

最后,我猜 CFC 也可以完成上述工作,但我会打破在 CFC 中拥有表示和逻辑数据的“规则”。

关于实现我想要做的最佳实践的任何建议?它最终将为成千上万的客户提供服务,因此我需要确保我的解决方案易于扩展。

4

3 回答 3

6

将 HTML 输出到屏幕的任何内容都应位于 .cfm 文件中。

话虽如此,根据您的需要,您可以在 CFC 中使用生成 HTML 的方法,但该方法只是将 HTML 作为字符串返回。

在编程中,很少有绝对的,但这里有一个:你不应该使用 output="true" 直接输出函数或方法内部的任何内容。相反,无论生成什么内容,都应该从方法中返回。

如果您需要多次使用此显示元素,则自定义标签可能是最好的方法,而不是包含。

于 2013-10-31T11:36:41.343 回答
1

Rules by which I live:) :

No CF business logic in CFM files. Just use some service which will serve template and provide needed data.

navService = com.foobar.services.Navigation(form, url);

and later output #navService.GetNavConent()#

No direct output from CFC files, functions should always return content. For example, make one function which makes one link based on some logic, second which wraps that and returns to cfm template.

Also one more hint, avoid using application and session scopes in your services.

This makes refactoring, testing and debugging too difficult.

For session you can make session.currentUser , CurrentUser.cfc which provides all things you need. e.g. session.currentUser.isAuthorized("backend/administration") and if true, show link to backend/administration.

Same for application, if you need locale, applicaiton wide setting or some singleton, make application.applicationSettings, ApplicationSettings.cfc and use that to retrieve all info you need in cfc's.

These rules will make your application to be easier to test and debug, and really easy to migrate tomorrow on some javascript based UI like Angular or backbone.js since all th edata you need is already in CFC and theoretically you just need to put remote in CFC or make some remote facade in the middle and you're done.

于 2013-11-01T16:50:56.193 回答
1

我将安全性视为我可以看到的菜单项和可以运行的页面的组合。

主要安全功能位于主会话对象内部

在菜单上

我调用了一个函数

if (session.objState.checkSecurity(Section, Item) == 1)
then ...

为了页面安全

function setupRequest() {
  ...
  if (session.objState.checkSecurity(getSection(), getItem()) == 0) {   
    location("#request.self#?message=LoginExpired", "no");  
    return; 
    }
  ...
  }

checkSecurity 可以做什么的细节因应用程序而异,但它与 FW/1 的工作方式有关。存在以下安全变化:

session.objState.checkSecurity(getSection())
session.objState.checkSecurity(getSection(), getItem())
session.objState.checkSecurity(getSection(), getItem(), Identifier)

没有任何演示文件对安全性有任何了解。

于 2013-10-31T18:11:33.680 回答