2011-08-17 11 views
9

Tôi có một hành động đảm bảo dữ liệu POST được bảo vệ bởi sfGuard. Điều này có nghĩa là nếu người dùng không đăng nhập, dữ liệu POST sẽ được gửi đến biểu mẫu đăng nhập. Thông thường, đây không phải là vấn đề, người dùng tiếp tục đăng nhập và phải gửi lại dữ liệu.Gửi yêu cầu POST đến hành động được bảo đảm

Thật không may, biểu mẫu đăng nhập dường như đang sử dụng dữ liệu POST như thể nó đã được gửi cùng với biểu mẫu. Điều này có nghĩa là nó phàn nàn rằng các trường tên người dùng và mật khẩu bắt buộc bị thiếu và nó phàn nàn rằng nó thiếu một mã thông báo CSRF. Vấn đề cuối cùng này không biến mất, sau khi gửi biểu mẫu, nghĩa là người dùng không thể đăng nhập.

Người dùng không được hiển thị biểu mẫu nếu chưa đăng nhập nhưng người dùng có thể đăng xuất bằng biểu mẫu vẫn mở. Vì vậy, tôi yêu cầu sự quan tâm của việc giữ giao diện kín nước và không có lỗi.

Đây có phải là một thiếu sót của sfGuard, có thể tránh được không, hoặc tôi đang làm điều gì đó sai hoàn toàn?

Để làm rõ, con đường trông như thế này:

add_subgroup: 
    url:  /group/:id/add 
    class: sfPropelRoute 
    options: 
    model: Group 
    type: object 
    param: { module: subgroups, action: create } 
    requirements: 
    group_id: \d+ 
    sf_method: [post] 

Các hình thức sử dụng để gửi các yêu cầu như sau:

<form action="<?php echo url_for('add_subgroup', $group) ?>" method="post"> 
    <input type="hidden" name="group_id" value="<?php echo $group->getId() ?>" /> 
    <input type="text" name="subgroup_id" /> 
    <input type="submit" class="button" value="Add" /> 
</form> 
+0

bạn có thể cụ thể hơn bạn đang cố gắng để thực hiện một mẫu đăng nhập hoặc những gì? – Henry

+0

Tôi đang cố gọi một hành động được bảo đảm. Nếu người dùng không đăng nhập, nó sẽ chuyển sang biểu mẫu đăng nhập hiện có. Do hành động yêu cầu dữ liệu POST, dữ liệu POST này đang can thiệp vào biểu mẫu. Bạn có thể cụ thể hơn về những gì tôi cần cụ thể hơn không? – Druckles

+0

Bạn xử lý như thế nào nếu người dùng chưa đăng nhập? Nếu bạn phát hành chuyển hướng tiêu đề thì dữ liệu POST sẽ bị xóa. nếu bạn thay vào đó là bao gồm nó, thì dữ liệu POST sẽ xuất hiện. –

Trả lời

6

Đó là một thiếu sót của sfGuard, vì hành động đăng nhập sẽ kiểm tra yêu cầu POST và nếu có thì hãy liên kết biểu mẫu.

Từ mã trong BasesfGuardActions.class.php:

if ($request->isMethod('post')) 
{ 
    $this->form->bind($request->getParameter('signin')); 

Tôi cá nhân không phải là một fan hâm mộ lớn của chuyển tiếp giữa các hành động trong symfony, và cũng giống như trong trường hợp này, tôi nghĩ rằng nó thích hợp hơn để chuyển hướng hơn về phía trước. Điều này cũng giải quyết vấn đề của bạn bởi vì điều này sẽ dẫn đến một yêu cầu GET mới. Bạn có thể thực hiện hành vi này bằng cách mở rộng sfGuardBasicSecurityFilter.

class mySecurityFilter extends sfGuardBasicSecurityFilter 
{ 

    protected function forwardToLoginAction() 
    { 
    $context = $this->getContext(); 
    // If you want to redirect back to the original URI (note: original POST data will be lost) 
    $context->getUser()->setReferer($context->getRequest()->getUri()); 
    $url = sfConfig::get('sf_login_module') . '/' . sfConfig::get('sf_login_action'); 
    $context->getController()->redirect($url); 
    throw new sfStopException(); 
    } 

} 

Bây giờ trong app/myapp/config/filters.yml

security: 
    class: mySecurityFilter 
0

Đây có lẽ là bởi vì bạn đặt mã của auth đăng nhập dữ liệu trong cùng một hành động (bằng cách kiểm tra xem yêu cầu có được đăng hay không).

Tuy nhiên, bạn có thể chia một hành động thành hai hành động. Một để hiển thị biểu mẫu đăng nhập và biểu mẫu khác là để xác thực dữ liệu đăng nhập của người dùng. Và đặt secure_action của bạn thành hành động chỉ để hiển thị biểu mẫu đăng nhập.