2017-02-22 49 views
1

В моем приложении у меня есть 2 части, внешний интерфейс сгенерирован вручную и панель управления, созданная с помощью администратора Sonata. И у меня есть проблемы с логином обеих частей:Вход в систему для входа в Symfony и учетную запись администратора сонаты Sonata

приложение/Config/security.yml

security: 

encoders: 
    FOS\UserBundle\Model\UserInterface: sha512 
    m_and_m\UsuariosBundle\Entity\Usuarios: { algorithm: sha512, iterations: 10 } 
    m_and_m\ClientesBundle\Entity\Clientes: { algorithm: sha512, iterations: 10 } 

access_control: 
    # URL of FOSUserBundle which need to be available to anonymous users 
    - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY } 

    # Admin login page needs to be access without credential 
    - { path: ^/admin/login$, role: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/admin/logout$, role: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/admin/login_check$, role: IS_AUTHENTICATED_ANONYMOUSLY } 

    # Secured part of the site 
    # This config requires being logged for the whole site and having the admin role for the admin part. 
    # Change these rules to adapt them to your needs 
    - { path: ^/admin/login ,role: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/admin/logout ,role: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/admin/* ,role: [ROLE_ADMIN, ROLE_SONATA_ADMIN,TOTAL] } 

    - { path: ^/usuarios/login, roles: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/usuarios/registro, roles: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/usuarios/*, roles: ROLE_USUARIO } 
    - { path: ^/clientes/*, roles: ROLE_CLIENTES } 


role_hierarchy: 
    ROLE_ADMIN:  [ROLE_USER, ROLE_SONATA_ADMIN,ROLE_USUARIO,ROLE_CLIENTE] 
    ROLE_SUPER_ADMIN: [ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH] 
    #SONATA: 
     #- ROLE_SONATA_PAGE_ADMIN_PAGE_EDIT # If you are using acl then this line must be commented 

providers: 
    fos_userbundle: 
     id: fos_user.user_manager 

    chain_provider: 
     chain: 
      providers: [usuarios, clientes] 
    usuarios: 
     entity: { class: m_and_m\UsuariosBundle\Entity\Usuarios, property: email } 
    clientes: 
     entity: { class: m_and_m\ClientesBundle\Entity\Clientes, property: email } 



firewalls: 


    # -> custom firewall for the admin area of the URL 
    admin: 
     pattern:   /admin(.*) 
     context:   user 
     form_login: 
      provider:  fos_userbundle 
      login_path:  /admin/login 
      use_forward: false 
      check_path:  /admin/login_check 
      failure_path: /admin/login 
     logout: 
      path:   /admin/logout 
      target:   /admin 
     anonymous:   true 
    # -> end custom configuration 

    # default login area for standard users 

    frontend: 
     pattern: ^/* 
     context: frontend 
     provider: chain_provider 
     anonymous: ~ 
     form_login: 
      login_path: usuarios_login 
      check_path: usuarios_login_check 
     logout: 
      path: usuarios_logout 

UsuariosBundle/Resources/Config/services.yml

services: 
usuarios.admin.usuarios: 
    class: m_and_m\UsuariosBundle\Admin\UsuariosAdmin 
    arguments: [~, m_and_m\UsuariosBundle\Entity\Usuarios, SonataAdminBundle:CRUD] 
    tags: 
     - {name: sonata.admin, manager_type: orm, group: Usuarios(Admin), label: Usuarios} 

login_listener: 
    class:  m_and_m\UsuariosBundle\Listener\LoginListener 
    arguments: [@security.context, @router] 
    tags: 
     - { name: kernel.event_listener, event: security.interactive_login } 
     - { name: kernel.event_listener, event: kernel.response } 

После документа я создал LoginListener в моем usuariosbundle. Когда я вхожу в систему из интерфейса, все идет отлично. Но админ панель Логин Sonata идет к файлу LoginListener.php и возвращает ошибку:

FatalErrorException: Error: Call to undefined method Application\Sonata\UserBundle\Entity\User::getNombre() in C:\wamp\www\m_and_m\src\m_and_m\UsuariosBundle\Listener\LoginListener.php line 24

LoginListener.php

<?php 
namespace m_and_m\UsuariosBundle\Listener; 

use Symfony\Componene\EventDispatcher\Event; 
use Symfony\Component\HttpKernel\Event\FilterResponseEvent; 
use Symfony\Component\Security\Http\Event\InteractiveLoginEvent; 
use Symfony\Component\Security\Core\SecurityContext; 
use Symfony\Component\Routing\Router; 
use Symfony\Component\HttpFoundation\RedirectResponse; 

class LoginListener 
{ 
private $contexto, $router, $usuario=null,$role=null; 

public function __construct(SecurityContext $context, Router $router) 
{ 
    $this->contexto=$context; 
    $this->router = $router; 
} 

public function onSecurityInteractiveLogin(InteractiveLoginEvent $event) 
{ 
    $token = $event->getAuthenticationToken(); 
    $this->usuario = $token->getUser()->getNombre(); 
    $this->role = $token->getRoles(); 
    $this->role=$this->role[0]->getrole(); 
    if($this->role=='ROLE_CLIENTE' && $token->getUser()->getActivo()==false){ 
     $this->usuario = null; 
    } 
} 

public function onKernelResponse(FilterResponseEvent $event) 
{ 
    if(null != $this->usuario) 
    { 
     if($this->role=='ROLE_USUARIO'){ 
      $portada=$this->router->generate('portada_usuario'); 
     } 
     else{ 
      $portada=$this->router->generate('portada_cliente'); 
     } 

     $event->setResponse(new RedirectResponse($portada)); 
     $event->stopPropagation(); 
    } 
} 
} 
?> 

И я не знаю, почему это происходит, вызывают как поставщики в другом контексте. Нужно ли мне делать что-то большее, чтобы отделить оба входа?

ответ

0

Вы вызываете метод, который не существует в этом объекте. Если вы обратите внимание на ошибку, вы увидите, что класс пользователя, который поступает из токена, не тот, который вы считаете.