2012-03-22 29 views
5

Tôi đang sử dụng FOSUserBundle và tôi yêu cầu khả năng đăng nhập từ 2 tuyến đường khác nhau (hoặc nhiều hơn). Các tuyến đường này sẽ có các mẫu khác nhau và cũng có thể đăng nhập vào các khu vực khác nhau. Điều duy nhất khác biệt giữa thông tin đăng nhập là quyền được yêu cầu. Các tuyến đường sẽ là một cái gì đó dọc theo dòng củaSymfony2 - FOSUserBundle - Nhiều vị trí đăng nhập

site.com/login

site.com/admin/login

và cũng có thể site.com/ajax_login

Tôi đã có thể tìm ra cách lấy các mẫu khác nhau để hiển thị bằng cách trích xuất mọi thứ nhưng mã thông báo CSRF từ FOSUserBundle login.html.twig (được ghi đè) rồi tạo các tuyến hiển thị hộp đăng nhập của riêng chúng và cũng là tuyến đăng nhập (để chỉ mã thông báo CSRF được hiển thị). Tính năng này không hoạt động đối với quản trị viên/đăng nhập khi biểu mẫu đăng lại để đăng nhập và nếu trang không hiển thị thì trang đó sẽ hiển thị trang đó.

Có cách nào dễ dàng để đạt được điều này không?

+0

Bạn có đang nói về các tường lửa khác nhau không? – tamir

+0

Bạn đã làm thế nào để sử dụng biểu mẫu đăng nhập trong nhiều mẫu? – httpete

Trả lời

0

Bạn có thể đăng mẫu của mình không?

Bạn đã chỉnh sửa đường dẫn chính xác trong mẫu chưa?

<form action="{{ path('form_submit') }}" method="post" {{ form_enctype(form) }}> 

Bạn muốn gửi biểu mẫu đến bộ điều khiển chính xác.

1

Dưới đây là những gì tôi cuối cùng đã đưa ra, về cơ bản đều sử dụng tường lửa cùng và chia sẻ bối cảnh tương tự như vậy khi tôi đăng nhập thông qua đăng nhập bình thường họ cũng được tiếp cận với các admin (giả sử họ là admin)

firewalls: 
    admin: 
     context:   site 
     switch_user:  true 
     pattern:   /admin(.*) 
     form_login: 
      provider:  fos_userbundle 
      login_path:  /admin/login 
      success_handler: admin_authentication_handler 
      use_forward: false 
      check_path:  /admin/login_check 
      failure_path: null 
      use_referer: true 
      always_use_default_target_path: true 
      default_target_path: /admin/ 
     logout: 
      path:   /admin/logout 
      target:   /admin/login 
     anonymous: true 
    public: 
     pattern: ^/ 
     context:   site 
     form_login: 
      login_path:  /login 
      success_handler: authentication_handler 
      failure_handler: authentication_handler 
      provider: fos_userbundle 
     anonymous: true 
     logout: true 

Tất nhiên nếu bạn cần tạo hộp đăng nhập AJAX, bạn cần ghi đè trình xử lý thành công và lỗi và kiểm tra xem yêu cầu có phải là XmlHttpRequest và trả lại kết quả của thông tin đăng nhập hay không.

2

Tôi đã bị mắc kẹt với cùng một câu hỏi trong một thời gian và sau đó tôi đã tự tạo một giải pháp. Tôi biết phải có một giải pháp dễ dàng ...

Tôi đã gửi yêu cầu kéo cho phép bạn tạo mẫu đăng nhập mới dễ dàng hơn. Kiểm tra yêu cầu kéo tại đây: https://github.com/FriendsOfSymfony/FOSUserBundle/pull/1186.

Ngoài ra còn có một cách khá dễ dàng khác để đạt được điều này. Mở rộng và thay đổi SecurityController renderLogin phương pháp với nội dung sau

protected function renderLogin(array $data, $template) 
{ 
    return $this->container->get('templating')->renderResponse('YourBundle:Security:login.html.twig'); 
} 

Sau đó, tạo ra một lộ trình để điều khiển vừa tạo:

admin.login: 
    pattern: /admin/login 
    defaults: { _controller: YourBundle:Security:login } 

Sau này duy nhất bạn phải làm là để thay đổi cấu hình bảo mật của bạn cho phù hợp. Thay đổi form_login login_path của bạn thành/admin/login và bạn tốt.

+0

yêu cầu kéo của bạn có lỗi và do đó chưa được hợp nhất vào FOSUserBundle. Bạn có cập nhật không? – Mondane

Các vấn đề liên quan