我需要在门户网站上开发一个带有Silex框架的选民系统(基于Symfony组件)。
这些不同的选民将检查当前用户是否在好国家,如果他在哪个程序中,如果他激活了网站上的广告,......我将它们与Unanime规则一起使用。
但我也想使用角色系统,我需要这个角色的选民优先于其他角色。
也就是说,如果角色选民弃权,那么其他选民可以通过共识决定做出决定,在任何其他情况下,它都是我想达成的共识角色。
Symfony是否提供了工具?我已经用矩阵模拟了肯定和一致决策管理的矩阵,但我还没有找到如何使角色选民比其他人更重要。
答案 0 :(得分:1)
您可以为选民设置优先级:
your_voter:
class: # ...
public: false
arguments:
# ...
tags:
- { name: security.voter , priority: 255 }
答案 1 :(得分:1)
实际上你必须自己编写AccessDecisionManager
来执行它:
在我的情况下,我需要RoleHierarchyVoter
覆盖其他选票,除非弃权。如果它弃权我使用一致的策略:
class AccessDecisionManager implements AccessDecisionManagerInterface {
private $voters;
public function __construct(array $voters) {
$this->voters = $voters;
}
public function decide(TokenInterface $token, array $attributes, $object = null) {
$deny = 0;
foreach ($this->voters as $voter) {
$result = $voter->vote($token, $object, $attributes);
if ($voter instanceof RoleHierarchyVoter) {
if ($result === VoterInterface::ACCESS_GRANTED)
return true;
elseif ($result === VoterInterface::ACCESS_DENIED)
return false;
else
continue;
}else {
if ($result === VoterInterface::ACCESS_DENIED)
$deny++;
}
}
if ($deny > 0)
return false;
else
return true;
}
}
注册我的自定义AccessDecisionManager:
$app['security.access_manager'] = $app->share(function (Application $app) {
return new AccessDecisionManager($app['security.voters']);
});