symfony - 如何在特征中使用authorizationChecker

标签 symfony traits

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

我尝试在 FormType 内部使用此特征,以便在多次尝试后显示验证码。

getIpOrUserId() 内部,我正在尝试检查用户是否已登录 $this->get('security.authorization_checker')->isGranted('IS_AUTHENTICATED_FULLY') 但它返回一个错误 尝试调用类的名为“get”的未定义方法

我认为不可能创建一个特征即服务,以便我可以注入(inject)安全对象。

有办法实现吗?

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 类时才有效,通常它在 Controller 类中使用。它只返回 $this->container->get($id),没有其他,这意味着它返回 Symfony\Component\DependencyInjection\Container 类。您应该将 security.authorization_checker 服务注入(inject)您的类(或您想要的其他服务),甚至整个 service_container 服务(但不建议 )。

示例:

class MyClass
{
    private $securityChecker;

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

    ...
}

服务.yml

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

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

关于symfony - 如何在特征中使用authorizationChecker,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30981816/

相关文章:

acl - 您已请求不存在的服务 "security.acl.dbal.connection"

rust - 是否有更简单的方法来创建自定义 Filter 方法来调用 Warp 处理程序?

使用 Heroku 部署 Symfony2 : Dumping assets

symfony - 如何在 Symfony 中注入(inject)类而不是服务?

generics - Rust:从(仅)<T> 不同的函数返回通用结构

c++ - 将参数包从一个模板复制到另一个模板并在内部别名中同时使用结果

rust - 如何编写支持+=操作的特征绑定(bind),其右手是Rust中复杂情况下的引用

java traits 还是 mixins 模式?

symfony - Twig:渲染 Symfony2 Controller ,扩展父模板中的 block

php - 使用 salt login 的 Symfony 2 总是返回 Bad credentials