防止 Grails Controller 中的方法暴露为操作

Posted

技术标签:

【中文标题】防止 Grails Controller 中的方法暴露为操作【英文标题】:Prevent method in Grails Controller from being exposed as action 【发布时间】:2012-08-20 09:42:38 【问题描述】:

我目前正在阅读并处理Getting Started with Grails, Second Edition by Scott Davis & Jason Rudolph 中的示例。

本书是使用 Grails 1.2 编写的。

他们有一个代码示例,他们在其中创建了一个由beforeInterceptor 调用的debug() 方法,并解释说由于debug() 是一种方法,因此它不会通过URL 向用户公开。他们解释说闭包作为控制器动作暴露给最终用户,但方法不是。

我在Grails 1.3 documentation上也看到了,他们提到了一个常规的方法:

def auth()  ...  

被视为私有,因为它是一种方法,而不是闭包。从 Grails 1.3 开始就是这样。

但是,从 Grails 2.0.0 开始,Controller Actions can be implemented as both methods and closures。

这让我想知道(并试图找出)一种方法来复制 Grails 2.0.0 之前的可用功能,即在控制器中创建一个不会暴露给最终用户的方法。

我想到了 2 种可能的方法,想知道哪种方式/实践更好,为什么?

    将访问器设置为私有,即private def auth()

    将方法的 allowedMethods 设置为空字符串:

    static allowedMethods = [save: "POST", update: "POST", delete: "POST", auth: ""]
    

这两种方法似乎都达到了预期的效果。但是,第一种方法给出了 HTTP 错误代码 404,而第二种方法给出了 HTTP 错误代码 405。

有谁知道哪种方法更可取?此外,还有其他方法或“最佳实践技术”吗?

【问题讨论】:

【参考方案1】:

在 Grails 2.0 中,任何标记为私有或受保护的方法都不会被视为操作。

出于维护原因,以这种方式标记方法会提供更多信息,因为在方法声明处可以看到该方法是否可操作,而不必回头查看allowedMethods 变量。此外,如果一个不可访问的方法的声明被删除或未添加到allowedMethods,则不会意外地使其可访问。

【讨论】:

【参考方案2】:

最好将其标记为私有,因为 404 隐藏了任何可以使用 405 知道有一个函数调用的地方。 (并不是说它会有多大用处。)

将方法标记为私有也很好,因为它在方法上表明它不是一个动作。

【讨论】:

+1,不应该公开的方法只是不应该“公开”,而不是“不允许”。

以上是关于防止 Grails Controller 中的方法暴露为操作的主要内容,如果未能解决你的问题,请参考以下文章

防止 Grails 2.4.4 接受无效日期

Grails 根据环境将 Service 注入到 Controller

grails中的CORS - 所有请求都失败了吗?

如何防止 Grails 3 创建会话?

将 Javascript 变量传递到 createlink 方法调用 Grails

Grails下如何防止异常导致事务回滚?