2012-09-06 2 views
5

관리자와 표준 사용자가 각각 별도의 보안 공급자로 처리되는 시스템이 있습니다. 관리자가 기본 사이트에 로그인하지 않은 경우 주 사이트의 방화벽 뒤에있는 파일이나 이미지에 관리자가 액세스 할 수 없기 때문에 관리 페이지에 문제가 발생했습니다.symfony 2 : 두 개의 개별 공급자가있는 방화벽 경로 액세스

공급자와 관계없이 모든 인증 된 사용자와 관리자가 이미지와 파일에 액세스 할 수 있어야합니다. 이들은 세분화 된 액세스 제어를 제공하는 컨트롤러를 통해 제공됩니다.

경로에 대한 액세스를 허용하기 위해 둘 이상의 공급자를 정의 할 수 있습니까?

가 여기에 우리의 현재 security.yml의 버전을 박탈입니다 :

security: 
    providers: 
     admin_user_db: 
      entity: { class: OurAdminUserBundle:AdminUser, property: username } 
     site_user_db: 
      entity: { class: OurSiteUserBundle:SiteUser, property: username } 
    firewalls: 
     admin_login: 
      pattern: ^/admin/login$ 
      security: false 
     site_user_login: 
      pattern: ^/login 
      security: false 
     file_route: 
      pattern: ^/file 
      anonymous: ~ 
      ### We need to allow this route only for authorized users from 
      ### either admin_user_db or site_user_db providers 
     admin_secured_area: 
      pattern: ^/admin 
      http_basic: ~ 
      provider: admin_user_db 
      form_login: 
       check_path: /admin/login_check 
       login_path: /admin/login 
      logout: 
       path: /admin/logout 
       target:/
     site_secured_area: 
      pattern: .* 
      http_basic: ~ 
      provider: site_user_db 
      form_login: 
       check_path: /check_login 
       login_path: /login 
       failure_path: /login 
       failure_forward: false 
      logout: 
       path: /logout 
       target:/

답변

5

내가 당신을 위해 무엇을 찾고 추측은 ChainProvider입니다. 이 공급자는 두 개의 현재 공급자를 순차적으로 사용하도록 구성됩니다.

체인 공급자는 처음 구성한 첫 번째 공급자로 사용자를 인증하려고 시도합니다. 성공하면 사용자가 인증됩니다. 실패한 경우 체인 공급자는 더 이상 공급자를 시도 할 수 없을 때까지 다음 단계를 시도합니다.

이 기술을 사용하여 사용자가 양식 로그인 또는 Facebook 로그인으로 인증 할 수있게했습니다. 나는 두 개의 제공자, 하나는 페이스 북을, 하나는 양식을 가지고있었습니다. 그런 다음 내 방화벽에서 공급자가 체인 공급자 였고 사용자가 자격 증명 또는 페이스 북 계정으로 로그인 할 수있었습니다.

체인 공급자가 순차적이므로 공급자가 가장 자주 사용하는 공급자를 배치하는 것이 좋습니다. 여기

심포니 문서 사이트에서 가져온 구성 샘플 : 당신은 여기 documenation에서 좀 걸릴 수 있습니다

security: 
    providers: 
     chain_provider: 
      chain: 
       providers: [in_memory, user_db] 
     in_memory: 
      users: 
       foo: { password: test } 
     user_db: 
      entity: { class: Acme\UserBundle\Entity\User, property: username 

:

  1. Using Multiple User Providers

감사합니다, 매트

+0

답변을 주셔서 감사합니다.이 지침으로 'ChainProvider'를 설정할 수있었습니다 (비록 구문이 약간 다르지만 Symfony의 우리 버전). 궁극적으로 우리는 @ Adminovser와 같은 역할을 대신 사용하여 'AdminUser'를 버리고 결국 별도의 공급자를 필요로하지 않는다는 것을 깨달았습니다. – Kaivosukeltaja

1

이 문제에 대한 경험이 약간 있었으므로 해결책은 Matt입니다.

그러나 응용 프로그램이 Administration, Student 및 Teacher 방화벽을 가졌으므로 필요한 경우 가장을 성공시킬 수 없었습니다. 즉, 관리의 사용자는 방화벽과 그로부터 사용자를 가장 할 수 있습니다.

이제 내가 잘못한 것은 가능하지만 시간이 지나치게 민감한 작업 이었기 때문에 모든 것을 단일 방화벽 뒤에두고 다른 역할을으로 지정하기로 결정했습니다. 이것은 훨씬 간단한 해결책으로 판명되었지만 궁극적으로 여러분에게 달렸습니다 ...

관련 문제