如何保护应用程序中的任何服务或方法

编辑本页

警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 2.7,现已不再维护。

本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。

如何保护应用程序中的任何服务或方法

在安全性文章中,您可以看到如何保护控制器通过请求security.authorization_checker服务容器,检查当前用户的角色:

1 2 3 4 5 6 7 8 9
/ /……使用ob娱乐下载组件安全核心异常AccessDeniedException公共函数helloAction的名字->denyAccessUnlessGranted (“ROLE_ADMIN”);/ /……

你还可以确保任何服务,通过注入security.authorization_checker服务。有关向服务中注入依赖项的一般介绍,请参见服务容器篇文章。例如,假设你有一个欧宝平台是合法的吗NewsletterManager类,它发送电子邮件,您希望将其使用限制为仅具有某些电子邮件的用户ROLE_欧宝平台是合法的吗NEWSLETTER_ADMIN的角色。在添加安全性之前,类看起来像这样:

12 3 4 5 6 7 8 9 10 11 12
/ / src / AppBund欧宝平台是合法的吗le /通讯/ NewsletterManager.php名称空间AppBundle欧宝平台是合法的吗通讯欧宝平台是合法的吗NewsletterManager公共函数send欧宝平台是合法的吗Newsletter()/ /……你在哪里工作/ /……

时检查用户的角色send欧宝平台是合法的吗Newsletter ()方法。实现这一目标的第一步是注入security.authorization_checker服务导入对象。因为这没有意义要执行安全检查,这是构造函数注入的理想候选者,它保证授权检查器对象将在欧宝平台是合法的吗NewsletterManager类:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16
/ / src / AppBund欧宝平台是合法的吗le /通讯/ NewsletterManager.php/ /……使用ob娱乐下载组件安全核心授权AuthorizationCheckerInterface欧宝平台是合法的吗NewsletterManager受保护的authorizationChecker公共函数__construct(AuthorizationCheckerInterfaceauthorizationChecker->authorizationChecker =authorizationChecker;}/ /……

然后在你的服务配置中,你可以注入服务:

  • YAML
  • XML
  • PHP
1 2 3 4 5
# app / config / services.yml服务:欧宝平台是合法的吗newsletter_manager:类:AppBundle 欧宝平台是合法的吗\通讯\ NewsletterManager参数:(“@security.authorization_checker”)

被注入的服务可用于执行安全检查send欧宝平台是合法的吗Newsletter ()方法调用:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
名称空间AppBundle欧宝平台是合法的吗通讯使用ob娱乐下载组件安全核心授权AuthorizationCheckerInterface使用ob娱乐下载组件安全核心异常AccessDeniedException/ /……欧宝平台是合法的吗NewsletterManager受保护的authorizationChecker公共函数__construct(AuthorizationCheckerInterfaceauthorizationChecker->authorizationChecker =authorizationChecker;}公共函数send欧宝平台是合法的吗Newsletter()如果= = =->authorizationChecker->isGranted (“ROLE_欧宝平台是合法的吗NEWSLETTER_ADMIN”)) {AccessDeniedException ();}/ /……/ /……

如果当前用户没有ROLE_欧宝平台是合法的吗NEWSLETTER_ADMIN,系统会提示他们登入。

使用注解的安全方法

选项还可以保护任何带有注释的服务中的方法调用JMSSecurityExtraBundle包。这个包不包含在Symfony标准发行版中,但是您可以选择安装它。ob娱乐下载

为了启用注释功能,标签控件保护的服务security.secure_service标记(您还可以为所有服务自动启用此功能,请参阅侧边栏下图):

  • YAML
  • XML
  • PHP
1 2 3 4 5 6
# app / config / services.yml服务:欧宝平台是合法的吗newsletter_manager:类:AppBundle 欧宝平台是合法的吗\通讯\ NewsletterManager标签:-名称:security.secure_service

然后你可以使用注释实现与上面相同的结果:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
名称空间AppBundle欧宝平台是合法的吗通讯使用JMSSecurityExtraBundle注释安全/ /……欧宝平台是合法的吗NewsletterManager/ * * *@ secure(角色= " ROLE_N欧宝平台是合法的吗EWSLETTER_ADMIN”)* /公共函数send欧宝平台是合法的吗Newsletter()/ /……/ /……

请注意

注释之所以有效,是因为为执行安全检查的类创建了代理类。这意味着,虽然您可以在公共方法和受保护方法上使用注释,但不能将它们用于私有方法或标记为final的方法。

jmssecurityextrabundance还允许保护方法的参数和返回值。有关更多信息,请参见JMSSecurityExtraBundle欧宝官网下载app文档。

在保护服务的方法时(如上所示),您可以单独标记每个服务,也可以激活的功能所有立即提供服务。要这样做,请设置secure_all_services配置选项为true:

  • YAML
  • XML
  • PHP
1 2 3 4
# app / config / config.ymljms_security_extra:#……secure_all_services:真正的

这种方法的缺点是,如果激活,初始页面加载可能非常慢,这取决于您定义了多少服务。

此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。