2016-08-06 2 views
-1

Я использую пользовательский интерфейс Symfony FOS, все работает отлично, за исключением 1 вещи.Symfony2 FOS логин с проверкой роли

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

security: 
 
    encoders: 
 
     FOS\UserBundle\Model\UserInterface: bcrypt 
 

 
    role_hierarchy: 
 
     ROLE_PARENT:  ROLE_USER 
 
     ROLE_ADMIN:  ROLE_PARENT 
 
     ROLE_SUPER_ADMIN: ROLE_ADMIN 
 

 
    providers: 
 
     fos_userbundle: 
 
      id: fos_user.user_provider.username 
 

 
    firewalls: 
 
     main: 
 
      pattern: ^/    
 
      form_login: 
 
       provider: fos_userbundle 
 
       csrf_provider: form.csrf_provider     
 

 
      logout:  true 
 
      anonymous: true 
 
     mijn: 
 
      pattern: ^/ 
 
      host: mijn.site 
 
      form_login: 
 
       provider: fos_userbundle 
 
       csrf_provider: form.csrf_provider 
 
       #csrf_token_generator: security.csrf.token_manager 
 
       # if you are using Symfony < 2.8, use the following config instead: 
 
       # csrf_provider: form.csrf_provider 
 

 
      logout:  true 
 
      anonymous: true 
 
      
 
    access_control: 
 
     - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY } 
 
     - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY } 
 
     - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY } 
 
     - { path: ^/admin/, role: ROLE_ADMIN } 
 
     
 
     - { host: mijn.site, path: ^/gegevens, role: IS_AUTHENTICATED_ANONYMOUSLY } 
 
     - { host: mijn.site, path: ^/, roles: ROLE_PARENT }

Так Логин может быть успешным только тогда, когда пользователь имеет ROLE_PARENT. Он должен терпеть неудачу, если он имеет ROLE_ADMIN или ROLE_SUPERADMIN без ROLE_PARENT.

ответ

1

Я не думаю, что FOSUserBundle предоставляет что-либо как таковое, и вам он не нужен. Вы можете использовать Custom User Checkers. Вот doc, который объясняет это подробно. После того, как вы включите класс UserChecker, вы можете ограничить доступ к имени пользователя под кодом checkPreAuth с вашим пользовательским сообщением.

Небольшой фрагмент кода:

public function checkPreAuth(UserInterface $user) 
{ 
    if (!in_array('ROLE_PARENT', $user->getRoles()) { 
     $ex = new DisabledException('Only Parent Users are allowed to login!'); 
     $ex->setUser($user); 
     throw $ex; 
    } 
} 

Работает в моей паре проектов. Надеюсь, это поможет!

0

Thanx много, это работает!

Помните:

  • Вам нужно по крайней мере Symfony 2.8 для этого

  • Вы должны определить user_checker для ВСЕХ обеспеченных областей в брандмауэре

+0

Но, 'Userchecker 'работает для меня в Symfony 2.7' – Jeet

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