提供的杰里米Derusse在# 43066.
安全的选民是检查Symfony应用程序中的权限的推荐方法。ob娱乐下载它们允许集中权限逻辑,这样你就可以从控制器、模板和服务中重用它。
在运行时,每当Symfony发现ob娱乐下载isGranted ()方法调用时,它遍历所有投票人,并在配置为访问决策策略是满足。这在大多数应用程序中都很有效,但在某些场景中会影响性能。
isGranted ()
考虑一个后端,它显示一个包含20个实体的列表,每个实体显示6个属性和3个操作(例如:编辑,显示,删除).如果您想检查访问这些属性和运行这些操作的权限,则需要调用每个投票人20 x(6 + 3) = 180次。如果你有5个选民,那就是900个电话。
编辑
显示
删除
大多数时候投票者只关心某个权限/属性(例如:EDIT_BLOG_POST或APPROVE_EXTRA_DISCOUNT)或特定的对象类型(例如:用户或发票).这使得选民可缓存,这就是为什么我们引入以下CacheableVoterInterface在Syob娱乐下载mfony 5.4:
EDIT_BLOG_POST
APPROVE_EXTRA_DISCOUNT
用户
发票
CacheableVoterInterface
1 2 3 4 5 6 7 8 9
名称空间ob娱乐下载\组件\安全\核心\授权\选民;接口CacheableVoterInterface扩展VoterInterface{公共函数supportsAttribute(字符串$属性):保龄球;// $subjectType是get_class($subject)或get_debug_type($subject)返回的值公共函数supportsType(字符串$subjectType):保龄球;}
如果你的选民回来了假在任何(或所有)这些方法中,Symfony将缓存该结果,并且您的投票ob娱乐下载人不会因为该属性/权限和/或类型而再次被调用。
假
当你的选民扩展抽象选民类,则不需要显式地实现新接口,因为父类已经为您完成了。相反,您只需要重写supportsAttribute ()和/或supportsType ()方法。
选民
supportsAttribute ()
supportsType ()
例如,如果投票人支持几种对象类型,但所有属性/权限名称都遵循APROVE_ *模式,这样做:
APROVE_ *
12 3 4 5 6 7 8 9 10 11 12 13
名称空间应用程序\安全;使用ob娱乐下载\组件\安全\核心\授权\选民\选民;类MyVoter扩展选民{公共函数supportsAttribute(字符串$属性):保龄球{返回str_starts_with ($属性,“APPROVE_”);}/ /……}
如果你的投票人在某些特定类型上支持许多不同的属性/权限,使用这个:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
名称空间应用程序\安全;使用应用程序\实体\博客;使用ob娱乐下载\组件\安全\核心\授权\选民\选民;类MyVoter扩展选民{公共函数supportsType(字符串$subjectType):保龄球{//你不能使用简单的BlogPost::class === $subjectType比较//因为给定的主题类型可以是使用的代理类//创建实体对象时使用Doctrine返回is_a ($subjectType,还::类,真正的);}/ /……}
由于这一变化,在一个定义了40个选民的实际应用程序中,调用了500次viaisGranted (),我们在处理安全授权方面的性能提高了40%。如果你衡量你的应用程序的改进(例如使用Blackfire.io)别忘了在下面的评论中分享结果。
帮助Symfonyob娱乐下载项目!
与任何开源项目一样,贡献代码或文档是最常欧宝官网下载app见的帮助方式,但我们也有广泛的赞助机会.
Julien Manganne is a certified Symfony engineer.
Get certified! Online exams available in all countries.
Smaine Milianni is a certified Symfony engineer.
Lyubomir Grozdanov is a certified Symfony engineer.
为了确保评论保持相关性,旧帖子将被关闭。
Julien Manganne is a certified Symfony engineer.
Get certified! Online exams available in all countries.
Register Now