2016-04-22 13 views
1

So, hier ist mein security.ymlSymfony ignoriert fosuser benutzerdefinierte Rollen

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

    role_hierarchy: 
     ROLE_CLINICIAN: ROLE_USER 
     ROLE_ADMIN:  ROLE_CLINICIAN 
     ROLE_OWNER:  ROLE_ADMIN 
     ROLE_SUPER_ADMIN: ROLE_OWNER 

    providers: 
     fos_userbundle: 
      id: fos_user.user_provider.username_email 

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

     main: 
      pattern: ^/ 
      form_login: 
       provider:  fos_userbundle 
       csrf_provider: security.csrf.token_manager 
      logout: true 
      anonymous: ~ 

    access_control: 
     - { path: ^/login$, roles: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/resetting, roles: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: /, roles: ROLE_USER } 
     - { path: ^/, roles: ROLE_ADMIN } 
     - { path: ^/api, roles: ROLE_OWNER } 
     - { path: ^/api, roles: ROLE_SUPER_ADMIN } 
     - { path: ^/api/clinics, roles: ROLE_CLINICIAN } 

Ich sollte Rollenhierarchie wie diese

ROLE_CLINICIAN 
     | 
    ROLE_ADMIN 
     | 
    ROLE_OWNER 
     | 
ROLE_SUPER_ADMIN 

Aber symfony ignoriert haben, denn jetzt bin ich machen wollen ROLE_CLINICIAN kann nur auf die Seite path: ^/api/clinics zugreifen, aber diese Rolle hat weiterhin Zugriff auf jede Seite

Antwort

0

Hier ist die Arbeitslösung

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

    role_hierarchy: 
     ROLE_ADMIN:  ROLE_CLINICIAN 
     ROLE_OWNER:  ROLE_ADMIN 
     ROLE_SUPER_ADMIN: ROLE_OWNER 

    providers: 
     fos_userbundle: 
      id: fos_user.user_provider.username_email 

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

     main: 
      pattern: ^/ 
      form_login: 
       provider:  fos_userbundle 
       csrf_provider: security.csrf.token_manager 
      logout: 
       path: fos_user_security_logout 
       target: fos_user_security_login 
      anonymous: ~ 

    access_control: 
     - { path: ^/login$, roles: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/resetting, roles: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/api/clients, roles: ROLE_CLINICIAN } 
     - { path: ^/api, roles: ROLE_SUPER_ADMIN } 
     - { path: ^/api, roles: ROLE_OWNER } 
     - { path: ^/#/, roles: ROLE_USER } 

Pfad: ^/gibt Zugang zu allen Seiten in meiner app, so der jeder Elternteil von ROLE_USER Zugriff sowieso jede Seite hat, aber von http://symfony.com/doc/current/cookbook/security/access_control.html

Remember, the first rule that matches is used, so dass der Trick zu setzen ist - {Pfad: ^/# /, Rollen: ROLE_USER} bis zum Ende der Liste.

0

Zugriffskontrollregeln werden von oben nach unten ausgewertet. Die erste übereinstimmende Zugriffssteuerungsregel gewinnt. In Ihrem Beispiel bedeutet dies, dass die letzten vier Regeln niemals berücksichtigt werden. Und da die ROLE_CLINICIAN Rolle die ROLE_USER Rolle enthält, wird Ihrem Benutzer immer Zugriff gewährt.

Sie können mehr darüber lesen, wie Zugriffskontrollregeln ausgewertet werden in the documentation.