2014-01-28 5 views
0

У меня есть пользовательский поставщик пользователя, следуя руководству в:Symfony2 Пользовательский поставщик пользователя не работает

http://symfony.com/doc/current/cookbook/security/custom_provider.html

Все работает без ошибок, но я не удается получить доступ к запретной зоне.

В моем классе UserProvider я устанавливаю $ role var для массива ("ROLE_USER"), и это разрешение, которое мне нужно для доступа к приложению/списку маршрута, но когда я перехожу в приложение/список, Symfony перенаправляет меня на логин снова и опять.

Я видел панель инструментов отладки и результаты:

Username anon. 
Authenticated? yes 
Roles { } 
Token class Symfony\Component\Security\Core\Authentication\Token\AnonymousToken 

Мой security.yml файл:

security: 
firewalls: 
    secured_area: 
     pattern: ^/ 
     anonymous: ~ 
     form_login: ~ 
     http_basic: 
      realm: "Secured Demo Area" 
     form_login: 
      provider: webservice 
      login_path: login 
      check_path: login_check 
      always_use_default_target_path: true 
      default_target_path: listado_actas 
     logout: 
      path: logout 
      target: login 

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

access_control: 
    - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/, roles: IS_AUTHENTICATED_ANONYMOUSLY } 

providers: 
    webservice: 
     id: webservice_user_provider 

encoders: 
    Symfony\Component\Security\Core\User\User: plaintext 
    Actas\Gestion\UserBundle\Security\User\WebServiceUser: 
     id: my.encoder.service 

Мой класс UserProvider выглядит следующим образом. Я просто называю сервис XML, который дает мне знак того, что я буду хранить в моих Класс_пользователей:

public function loadUserByUsername($username) 
{ 
    $salt = ""; 
    $roles = ""; 
    // make a call to your webservice here 

    $password = $this->request->get('_password'); 
    $xml_interface = new XMLInterfaceBundle(); 
    $token = $xml_interface->requestLogin($username, $password); 

    if (strlen($token) > 10) { 
     $roles = array("ROLE_USER"); 
     $salt = ""; 
     return new WebserviceUser($username, $password, $salt, $roles, $token); 
    } 

    throw new UsernameNotFoundException(sprintf('Username "%s" does not exist.', $username)); 
} 

Это мой UserObject в DaoAuthenticationProvider :: checkAuthentication()

Actas\Gestion\UserBundle\Security\User\WebserviceUser Object 
(
    [username:Actas\Gestion\UserBundle\Security\User\WebserviceUser:private] => 44886706X 
    [password:Actas\Gestion\UserBundle\Security\User\WebserviceUser:private] => 44886706XkCrDP 
    [salt:Actas\Gestion\UserBundle\Security\User\WebserviceUser:private] => 
    [roles:Actas\Gestion\UserBundle\Security\User\WebserviceUser:private] => Array 
     (
      [0] => ROLE_ADMIN 
     ) 

    [my_token:Actas\Gestion\UserBundle\Security\User\WebserviceUser:private] => 
) 

Это мой routing.yml :

xml_interface: 
    resource: "@XMLInterfaceBundle/Resources/config/routing.yml" 
    prefix: /

actas: 
    resource: "@ActasBundle/Resources/config/routing.yml" 
    prefix: /

login: 
    pattern: /login 
    defaults: { _controller: UserBundle:Default:login } 

login_check: 
    pattern: /login_check 

logout: 
    pattern: /logout 
+0

Как вы установили 'role_hierarchy' в' security.yml'? – lvarayut

+0

У меня нет этого, нужно ли это? –

+0

Да, я так думаю. Я упомянул в своем комментарии. – lvarayut

ответ

0

Просто попробуйте установить Role_hierarchy следующим образом:

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

Не забудьте установить role вашего User как ROLE_ADMIN, например, чтобы соответствовать role_hierarchy.

+0

Я сделал это, и он не работает ... он перенаправляет меня на логин. –

+0

Если у меня есть пользовательский UserProvider, нужно ли иметь пользовательскую авторизацию или вернуть WebserviceUser должно быть достаточно? –

+0

Странно, что он не работает. Вам нужна специальная авторизация. Вы уверены, что задали роль своего объекта 'User' как' ROLE_ADMIN'? Если да, обновите свой вопрос, и я могу проверить, правильно ли вы это сделали или нет. Еще одна вещь, вы очистили кеш? – lvarayut

Смежные вопросы