热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Symfony单元测试安全性(ACL-注释)-SymfonyunittestSecurity(ACL-Annotation)

Idliketocheckamethodwithaccesscontrol,e.g.amethodisonlygrantedwithaspecificrole.

I'd like to check a method with access control, e.g. a method is only granted with a specific role. Therefore, I know two ways in Symfony:

我想检查一个带访问控制的方法,例如:方法仅授予特定角色。因此,我在Symfony中了解两种方式:

  1. @Security annotation above the method (SensioFrameworkExtraBundle) OR
  2. 方法上方的@Security注释(SensioFrameworkExtraBundle)或
  3. Calling authorization_checker explizit within my method
  4. 在我的方法中调用authorization_checker exploizit

When it comes to unit tests (for my case phpspec, but I think phpunit behaviour is the almost the same in that case), I would like to test that only anonymous users should be able to call a method. With number 2. , it's working fine. Here my setup:

当谈到单元测试时(对于我的案例phpspec,但我认为phpunit行为在这种情况下几乎相同),我想测试只有匿名用户应该能够调用方法。数字2,它工作正常。在这里我的设置:

RegistrationHandlerSpec:

RegistrationHandlerSpec:

class RegistrationHandlerSpec extends ObjectBehavior
{     
   function let(Container $container, AuthorizationCheckerInterface $auth) {
     $container->get('security.authorization_checker')->willReturn($auth);
     $this->setContainer($container);
   }

   function it_should_block_authenticated_users(AuthorizationCheckerInterface $auth)
   {
     $auth->isGranted("ROLE_USER")->willReturn(true);
     $this->shouldThrow('Symfony\Component\Security\Core\Exception\AccessDeniedException')->during('process', array());
   }  
}

And within the RegistrationHandler, I have the following method:

在RegistrationHandler中,我有以下方法:

class RegistrationHandler
{
  public function process()
  {
     $authorizatiOnChecker= $this->get('security.authorization_checker');
     if ($authorizationChecker->isGranted('ROLE_USER')) {
         throw new AccessDeniedException();
     }
     // ...
  }
}

Well, this approach is working fine - BUT normally, I would prefer using 1. with Security annotation (Sensio FrameworkExtraBundle), and therefore, it's not working / I don't know why no Exception gets triggered when it's written as an annotation:

好吧,这种方法工作正常 - 但通常情况下,我更喜欢使用1.带有安全注释(Sensio FrameworkExtraBundle),因此,它不起作用/我不知道为什么没有在将它作为注释编写时触发异常:

/**
 * @Security("!has_role('ROLE_USER')")
 */
public function process()
{
   // ...
}

Does anyone know how to get this example to work by using the first approach with @Security annotation, which is way more readable and best practice recommended of symfony?

有没有人知道如何通过使用@Security注释的第一种方法来使这个例子工作,这是更可读和symfony推荐的最佳实践?

1 个解决方案

#1


6  

In both cases you're testing a behaviour that's provided by third party code (the Symfony framework). Following the rule don't mock what you don't own, rather than writing a unit test you should write an integration test. Otherwise you'll be only making assumptions on how the code works with no proof it really works this way.

在这两种情况下,您都在测试由第三方代码(Symfony框架)提供的行为。遵循规则不要模拟你不拥有的东西,而不是编写单元测试,你应该编写集成测试。否则你只会假设代码是如何工作的,没有证明它真正起作用。

In your case your integration test could be a controller test. You'd call the URL with a web test client (provided by the WebTestCase) and verify that in certain conditions you're getting a 401 or 403 response.

在您的情况下,您的集成测试可能是控制器测试。您可以使用Web测试客户端(由WebTestCase提供)调用URL,并验证在某些情况下您获得401或403响应。

PHPSpec is a unit testing tool (a.k.a. a design tool). You need to write integration tests with something else (for example PHPUnit). I usually have at least three testing tools installed in my project:

PHPSpec是一种单元测试工具(也就是设计工具)。您需要使用其他东西编写集成测试(例如PHPUnit)。我的项目通常至少安装了三个测试工具:

  • PhpSpec for unit testing
  • PhpSpec用于单元测试
  • PHPUnit for integration testing
  • PHPUnit用于集成测试
  • Behat for acceptance testing (a form of integration testing)
  • 适用于验收测试(一种集成测试)

推荐阅读
  • 如何解决《在测试类Symfony2中获取容器》经验,为你挑选了1个好方法。 ... [详细]
  • 如何解决《是否可以在不扩展PHPUnit_Framework_TestCase的情况下使用PHPUnit断言?》经验,为你挑选了1个好方法。 ... [详细]
  • 如何解决《PHPUnit测试double抛出PHPUnit_Framework_MockObject_BadMethodCallException》经验,为你挑选了1个好方法。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • IOS开发之短信发送与拨打电话的方法详解
    本文详细介绍了在IOS开发中实现短信发送和拨打电话的两种方式,一种是使用系统底层发送,虽然无法自定义短信内容和返回原应用,但是简单方便;另一种是使用第三方框架发送,需要导入MessageUI头文件,并遵守MFMessageComposeViewControllerDelegate协议,可以实现自定义短信内容和返回原应用的功能。 ... [详细]
  • 本文介绍了使用Spark实现低配版高斯朴素贝叶斯模型的原因和原理。随着数据量的增大,单机上运行高斯朴素贝叶斯模型会变得很慢,因此考虑使用Spark来加速运行。然而,Spark的MLlib并没有实现高斯朴素贝叶斯模型,因此需要自己动手实现。文章还介绍了朴素贝叶斯的原理和公式,并对具有多个特征和类别的模型进行了讨论。最后,作者总结了实现低配版高斯朴素贝叶斯模型的步骤。 ... [详细]
  • 如何解决《如何在测试失败时使用PHPUnit和Selenium2捕获屏幕截图?》经验,为你挑选了2个好方法。 ... [详细]
  • 如何解决《如何使用PHAR在MAMP中配置PHPUnit》经验,为你挑选了1个好方法。 ... [详细]
  • 如何解决《是否可以在PhpUnit中的测试用例外创建一个模拟?》经验,为你挑选了1个好方法。 ... [详细]
author-avatar
刘浩不来丷上海594865126
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有