Symfony 3 - добавление security.authorization_checker в аргументы моего сервиса вызывает слишком много перенаправлений - PullRequest
0 голосов
/ 12 июня 2018

Я пытаюсь создать пользовательский прослушиватель в моем приложении Symfony 3.

Я хочу проверить, является ли пользователь IS_AUTHENTICATED_FULLY или нет.

Когда я добавляю службу @ security.authorization_checker в качестве аргумента для моего Iполучаю слишком много ошибок перенаправления на мой маршрут входа

У кого-нибудь есть работающее решение в symfony 3

security.yml:

security:
    providers:
        main:
            entity:
                class: Customer\CustomerBundle\Entity\utilisateur
                property: loginUtil
encoders:
    Customer\CustomerBundle\Entity\utilisateur:
    algorithm: sha1
    encode_as_base64: false
    iterations: 1

firewalls:
    dev:
    pattern: ^/(_(profiler|wdt)|css|images|js)/
    security: false

    Customer_firewall:
        pattern: ^/
        anonymous: true
        provider: main            

        form_login:
            login_path: /login
            check_path: /login_check

        logout:
            path: /logout
            target: Customer_standard_homepage

access_control:
    - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/register, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/reset, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/profile, roles: ROLE_USER }

role_hierarchy:
    ROLE_ADMIN : [ROLE_USER]
    ROLE_SUPER_ADMIN: [ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]

Services.yml

services:
login_listener:
    class: 'Customer\CustomerBundle\Listener\LoginListener'
    arguments: ['@security.authorization_checker', '@doctrine']
    tags:
        - { name: 'kernel.event_listener', event: 'security.authentication.success', method: onSecurityAuthentication }

LoginListener.php

<?php
namespace Customer\CustomerBundle\Listener;

use Symfony\Component\Security\Core\Event\AuthenticationEvent;
use Symfony\Component\Security\Core\Authorization\AuthorizationChecker;

/**
 * Custom login listener.
 */

class LoginListener
{
  private $authorizationChecker;
  private $em;

  public function __construct(AuthorizationChecker $authorizationChecker, Doctrine $doctrine)
  {
    $this->authorizationChecker = $authorizationChecker;
    $this->em                   = $doctrine->getEntityManager();
  }

  /**
   * Do the magic.
   * 
   * @param InteractiveLoginEvent $event
   */
  public function onSecurityAuthentication(AuthenticationEvent $event)
  {
    if ($this->authorizationChecker->isGranted('IS_AUTHENTICATED_FULLY')) {
      // user has just logged in
      error_log('here');
    }

    if ($this->authorizationChecker->isGranted('IS_AUTHENTICATED_REMEMBERED')) {
      // user has logged in using remember_me cookie
      error_log('there');
    }

    // do some other magic here
    $user = $event->getAuthenticationToken()->getUser();
    error_log('FINALLY HERE');

    // ...
  }
}

ERR_TOO_MANY_REDIRECTS

1 Ответ

0 голосов
/ 19 июня 2018

Вы можете использовать диспетчер определения доступа следующим образом:

use Symfony\Bridge\Doctrine\RegistryInterface;
use Symfony\Component\Security\Core\Authorization\AccessDecisionManagerInterface;
use Symfony\Component\Security\Core\Event\AuthenticationEvent;

class LoginListener
{
    private $accessDecisionManager;
    private $doctrine;

    public function __construct(AccessDecisionManagerInterface $accessDecisionManager, RegistryInterface $doctrine)
    {
        $this->accessDecisionManager = $accessDecisionManager;
        $this->doctrine              = $doctrine;
    }

    /**
     * Do the magic.
     *
     * @param AuthenticationEvent  $event
     */
    public function onSecurityAuthentication(AuthenticationEvent $event)
    {
        $em = $this->doctrine->getEntityManager();
        if ($this->accessDecisionManager->decide($event->getAuthenticationToken(), ['IS_AUTHENTICATED_FULLY'])) {
            error_log('here');
        }

        if ($this->accessDecisionManager->decide($event->getAuthenticationToken(), ['IS_AUTHENTICATED_REMEMBERED'])) {
            // user has logged in using remember_me cookie
            error_log('there');
        }

        // do some other magic here
        $user = $event->getAuthenticationToken()->getUser();
        error_log('FINALLY HERE');

        // ...
    }
}

И определение сервиса должно быть изменено на это:

login_listener:
    class: 'Customer\CustomerBundle\Listener\LoginListener'
    arguments: ['@security.access.decision_manager', '@doctrine']
    tags:
        - { name: 'kernel.event_listener', event: 'security.authentication.success', method: onSecurityAuthentication }

Я также немного изменил конструктор,в общем, при использовании внедрения зависимостей рекомендуется по возможности ссылаться на интерфейс.Также конструктор не должен делать слишком много вещей (я удалил вызов getEntityManger() и переместил id в слушатель).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...