动态添加角色给用户

mai*_*ald 15 user-roles symfony

我们使用Symfony2的角色功能来限制用户访问我们应用的某些部分.我们的每个用户实体都有许多具有开始日期和结束的订阅实体,用户可以购买年度订阅.

现在,有没有办法根据用户是否拥有"有效"订阅动态添加角色?在rails中,我只是让模型处理它是否具有必要的权限,但我知道通过设计symfony2实体不应该访问Doctrine.

我知道你可以从一个实体实例中访问一个实体的关联,但是它会遍历所有用户的订阅对象,这对我来说似乎不那么麻烦.

Kri*_*ith 27

我认为你最好设置一个自定义选民和属性.

/**
 * @Route("/whatever/")
 * @Template
 * @Secure("SUBSCRIPTION_X")
 */
public function viewAction()
{
    // etc...
}
Run Code Online (Sandbox Code Playgroud)

SUBSCRIPTION_X角色(又名属性)需要通过一个自定义的选民类进行处理.

class SubscriptionVoter implements VoterInterface
{
    private $em;

    public function __construct($em)
    {
        $this->em = $em;
    }

    public function supportsAttribute($attribute)
    {
        return 0 === strpos($attribute, 'SUBSCRIPTION_');
    }

    public function supportsClass($class)
    {
        return true;
    }

    public function vote(TokenInterface $token, $object, array $attributes)
    {
        // run your query and return either...
        //  * VoterInterface::ACCESS_GRANTED
        //  * VoterInterface::ACCESS_ABSTAIN
        //  * VoterInterface::ACCESS_DENIED
    }
}
Run Code Online (Sandbox Code Playgroud)

您需要配置和标记您的选民:

services:
    subscription_voter:
        class: SubscriptionVoter
        public: false
        arguments: [ @doctrine.orm.entity_manager ]
        tags:
            - { name: security.voter }
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢!我以前没有看过也没听说过选民.我总是发现sf2更有趣的功能几乎没有记录,而且非常基本的东西太多了. (4认同)