【问题标题】:How to unit test authorization globally in CakePHP如何在 CakePHP 中对授权进行全局单元测试
【发布时间】:2016-02-03 18:07:39
【问题描述】:

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

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

这是我的想法:

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

这个想法是,每次我们故意让非管理员用户做某事时,测试都会失败,并提醒我们去更新异常列表。但是如果我们在不知情的情况下不小心允许了一个动作,测试就会失败,我们会修复错误。这是一个安全隐患。

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

【问题讨论】:

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


    【解决方案1】:

    这是正确的做法吗?

    解决问题而不是症状:修复您的开发人员提交“测试”和“调试”代码或任何您想命名的代码的行为。进行同行评审或让您的团队领导评审提交。您可以尝试在https://workplace.stackexchange.com/ 上询问如何最好地处理这种情况。以this question 为例。

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

    使用它来获取带有控制器的文件夹列表:

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

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

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

    设置测试认证is described here

    如果您编写一个自定义测试,该测试使用描述控制器和操作及其权限的数组结构,我很确定您将能够通过运行该数组结构并使用该信息来运行身份验证来自动化它测试。但老实说,我不会在这里做那种的工作。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-30
      • 2015-10-03
      • 1970-01-01
      • 2016-10-24
      • 2016-09-07
      • 1970-01-01
      • 1970-01-01
      • 2015-02-23
      相关资源
      最近更新 更多