How to use the AccessDecisionManager in Symfony2 for authorization of arbitrary users?

后端 未结 7 1904
庸人自扰
庸人自扰 2020-12-14 21:14

I\'d like to be able to verify whether or not attributes (roles) are granted to any arbitrary object implementing UserInterface in Symfony2. Is this possible?

7条回答
  •  庸人自扰
    2020-12-14 21:47

    Create a service AccessDecisionMaker (used Shady's solution)

    container = $container;
    
            if (!$this->securityContext) {
                // Ensure security context is created only once
                $this->securityContext = new SecurityContext($this->container->get(
                    'security.authentication.manager'
                ), $this->container->get('security.access.decision_manager'));
            }
        }
    
        public function isGranted($roleToCheck, UserInterface $user)
        {
            if (!is_string($roleToCheck)) {
                if (!($roleToCheck instanceof RoleInterface)) {
                    throw new \InvalidArgumentException('First argument expects a string or instance of RoleInterface');
                }
                $roleToCheck = $roleToCheck->getRole();
            }
    
            $token = new UsernamePasswordToken($user, null, $this->container->getParameter(
                'fos_user.firewall_name'
            ), $user->getRoles());
            $this->securityContext->setToken($token);
            if ($this->securityContext->isGranted($roleToCheck)) {
                return true;
            }
    
            return false;
        }
    
    }
    

    Configure this as a service

    bp.access_decision_maker:
        class: Bp\CommonBundle\Service\AccessDecisionMaker
        arguments:  [@service_container ]
    

    Use it

    $this->container->get('bp.access_decision_maker')->isGranted("ROLE_ADMIN",$user);
    

提交回复
热议问题