如何在特征中使用 authorizationChecker

How to use authorizationChecker inside a trait

我有一个特征可以检查用户是否登录以及尝试访问特定位置的次数。

我试图在 FormType 中使用这个特性,以便在多次尝试后显示验证码。

内部 getIpOrUserId() 我正在尝试检查用户是否已登录 $this->get('security.authorization_checker')->isGranted('IS_AUTHENTICATED_FULLY') 但 returns 出现错误 Attempted to call an undefined method named "get" of class.

我认为不可能将特征创建为服务,因此我可以注入安全对象。

有办法实现吗?

Trait

<?php

Trait CheckAttempts {

public function getTryAttempts()
{
    if ($this->getIpOrUserId() == null) {
        return false;
    } else {
        $attempts = $this->getDoctrine()
            ->getRepository('SiteBundle:LoginAttempts')
            ->findOneByIpOrUserId($this->getIpOrUserId());
    }

    return $attempts->getAttempts();
}

protected function getIpOrUserId()
{
     //get logged in user
    //if ($this->authorizationChecker->isGranted('IS_AUTHENTICATED_FULLY')) {
      if ($this->get('security.authorization_checker')->isGranted('IS_AUTHENTICATED_FULLY')) {
        $ipOrUserId = $this->get('security.token_storage')->getToken()->getUser()->getId();            
    } else {
        $ipOrUserId = $this->container->get('request_stack')->getCurrentRequest()->getClientIp();
    }
    return $ipOrUserId;
}

FormType

class RegisterType extends AbstractType
{

use FormSendLimitTrait;

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {

    $form = $event->getForm();
    var_dump($this->getTryAttempts());

    $form->add('captcha', 'captcha', 
          'label' => 'site.captcha'
    ]);

    /*if ($attempts->getAttempts() > 6) {
        $form->add('captcha', 'captcha', [
            'label' => 'site.captcha'
        ]);
    }*/
})

get 方法仅在扩展 Symfony\Bundle\FrameworkBundle\Controller\Controller class 时有效,通常在控制器 classes 中使用。而且它returns只有$this->container->get($id),没有别的,这意味着它returnsSymfony\Component\DependencyInjection\Containerclass。您应该将 security.authorization_checker 服务注入您的 class(或您想要的其他服务),甚至整个 service_container 服务(但不推荐) .

示例:

class MyClass
{
    private $securityChecker;

    public function __construct(Symfony\Component\Security\Core\Authorization\AuthorizationChecker $securityChecker)
    {
        $this->securityChecker = $securityChecker;
    }

    ...
}

services.yml

services:
    my_class_service:
        class: Acme\DemoBundle\MyClass
        arguments: 
           - @security.authorization_checker

但是你的情况you should not use traits like you're doing.