2012-06-05 39 views
8

Chúng tôi đã định cấu hình thành công FOSUserBundle; đăng nhập, đăng ký, đặt lại mật khẩu, vv, tất cả đều hoạt động tốt.Symfony FOSUserBundle - bao gồm biểu mẫu đăng nhập trong mẫu bố cục

Bây giờ, chúng tôi muốn kết hợp biểu mẫu đăng nhập vào bố cục trang web chung của chúng tôi, đặc biệt là đặt biểu mẫu vào phần trên cùng bên phải của tiêu đề bố cục. Làm điều này sẽ dễ dàng nếu chúng ta chỉ xử lý các trường tên người dùng và mật khẩu. Tuy nhiên, chúng tôi dường như không thể tìm ra cách để có được những CSRF token được tạo ra bởi các dịch vụ FOSUserBundle:

$this->container->get('form.csrf_provider')->generateCsrfToken('authenticate'); 

tôi đã cố gắng gọi trên trong vòng một phần mở rộng cành mà nếu không hoạt động tốt tuy nhiên có vẻ như phần mở rộng không thể tham chiếu đúng vùng chứa.

Chắc chắn có một số cách dễ dàng để nhận mã thông báo CSRF FOSUserBundle trên toàn cầu?

Cảm ơn! Jason

Trả lời

6

Bạn có thể định nghĩa một hàm như thế này trong một trong các bộ điều khiển của bạn

và sau đó chỉ cần nhúng nó vào hình thức của bạn thông qua

<input type="hidden" name="_csrf_token" value="{% render('YourBundle:YourController:getToken') %}" /> 

Bạn cũng cần phải bao gồm những điều sau tại đầu bộ điều khiển của bạn:

use Symfony\Component\HttpFoundation\Response; 
34

Symfony 2.3:

Một giải pháp khả thi sẽ được xác định nhà cung cấp CSRF như là một biến Twig toàn cầu như thế này:

twig: 
    globals: 
     fos_csrf_provider: "@form.csrf_provider" 

Và sau đó trong cách bố trí của bạn gọi nó là như thế này:

<input type="hidden" name="_csrf_token" value="{{ fos_csrf_provider.generateCsrfToken('authenticate') }}" /> 

Vì vậy, bạn không cần phải gọi bất kỳ bộ điều khiển nào.

Symfony 2.4 và sau này:

twig: 
    globals: 
     fos_csrf_provider: "@security.csrf.token_manager" 

và:

<input type="hidden" name="_csrf_token" value="{{ fos_csrf_provider.refreshToken('authenticate') }}" /> 
+1

lưu ngày của tôi! cảm ơn bạn rất nhiều! – fanjabi

+3

Điều này phải được đánh dấu là câu trả lời hay nhất - sạch hơn và dễ hơn so với câu trả lời khác. –

+0

Đây là giải pháp tốt nhất và sạch nhất. Render bộ điều khiển trong các mẫu tiêu thụ rất nhiều tài nguyên: giải pháp này là tốt nhất và sạch nhất. – Aerendir

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