如何在CakePHP

时间:2016-02-03 18:07:40

标签: unit-testing cakephp permissions authorization cakephp-3.0

我们正在使用带有CakeDC Users plugin的CakePHP v3.1.x。

我们正在尝试设置我们的单元测试,以帮助防止意外地允许非管理员执行他们不应该做的事情。例如,假设开发人员使用控制器中的新操作创建新的管理功能。在开发过程中,她将权限设置得非常宽松,因此每次都不必登录进行测试(或者某些事情......你明白了)。我试图编写一个如果她试图推动这个问题就会失败的测试...

以下是我对如何做的想法:

  • 创建一个循环覆盖应用中所有控制器/操作的测试,并检查非管理员用户是否获得授权。
  • 该测试列出了非管理员用户可以
  • 执行的每项操作。
  • 如果允许非管理员执行不在列表中的任何操作,则测试失败。

我们的想法是,每当我们故意让非管理员用户做某事时,测试就会失败,并提醒我们更新例外列表。但是如果我们在不知情的情况下意外地允许一个动作,那么测试就会失败并且我们会修复错误。这是一个安全问题。

我的问题:这是正确的方法吗?如果是这样,我们如何动态生成所有应用程序控制器/操作的列表?

1 个答案:

答案 0 :(得分:0)

  

这是正确的方法吗?

解决问题而非症状:修复开发人员提交的行为" test"和"调试"代码或任何你想要命名的代码。进行同行评审或让您的团队负责人审核提交。您可以尝试https://workplace.stackexchange.com/询问如何最好地处理这种情况。请查看this question以获取示例。

  

如果是这样,我们如何动态生成所有应用程序控制器/操作的列表?

使用此命令获取带控制器的文件夹列表:

App::path('Controller'); // App
App::path('Controller', 'MyPlugin'); // Some plugin

使用Plugin::loaded()获取所有插件的列表。

然后使用该信息从所有文件夹中读取控制器类。然后,您可以自动生成测试用例(可能是通过烘焙shell的新任务?),因为您已经从应用程序和插件中获得了控制器列表。使用反射从控制器获取公共方法列表,并过滤已知的公共方法,如initialize()。

设置测试验证is described here

如果您编写的自定义测试使用描述控制器和操作及其权限的数组结构,我非常确定您可以通过运行该数组结构并使用该信息来自动化它运行身份验证测试。但老实说,我不打算 在这里工作。

或者不是直接测试代码,而是使用Codeception验收测试。 CakePHP has plugin。这将允许您测试"真实"网站通过自动点击测试。设置一个特定的用户会话,然后通过期望重定向到登录操作或您做的任何事情来测试URL以进行访问应该非常容易。