2011-08-17 21 views
9

मेरे पास एक ऐसी क्रिया है जो एसएफगार्ड द्वारा सुरक्षित पोस्ट डेटा लेती है। इसका अर्थ यह है कि यदि उपयोगकर्ता लॉग इन नहीं है, तो POST डेटा लॉग इन फॉर्म में भेजा जाएगा। आमतौर पर, यह कोई समस्या नहीं है, उपयोगकर्ता लॉग इन करना जारी रखता है, और उसे फिर से डेटा जमा करना पड़ता है।सुरक्षित कार्रवाई के लिए POST अनुरोध भेजना

दुर्भाग्य से, लॉग इन फॉर्म POST डेटा का उपयोग कर रहा है जैसे कि यह फ़ॉर्म के साथ ही सबमिट किया गया था। इसका मतलब यह है कि यह शिकायत कर रहा है कि आवश्यक उपयोगकर्ता नाम और पासवर्ड फ़ील्ड गुम हैं, और यह शिकायत करता है कि इसमें सीएसआरएफ टोकन गुम है। फ़ॉर्म को सबमिट करने के बाद, यह आखिरी समस्या दूर नहीं जाती है, जिसका अर्थ है कि उपयोगकर्ता लॉग इन नहीं कर सकता है, वैसे भी।

उपयोगकर्ता लॉग इन नहीं होने पर फॉर्म के साथ प्रस्तुत नहीं किया जाना चाहिए, लेकिन उपयोगकर्ता के लिए अभी भी फॉर्म के साथ लॉग आउट करना संभव हो सकता है। इसलिए मैं इंटरफेस वॉटरटाइट और त्रुटि मुक्त रखने के हित में पूछ रहा हूं।

क्या यह एसएफगार्ड की कमी है, क्या इससे बचा जा सकता है, या क्या मैं कुछ गलत कर रहा हूं?

स्पष्ट करने के लिए मार्ग इस तरह दिखता है:

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] 

इस प्रकार अनुरोध सबमिट करने के लिए इस्तेमाल रूप है:

<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

आप अधिक विशिष्ट हो सकता है आप एक लॉगिन फार्म या क्या करने की कोशिश कर रहे हैं? – Henry

+0

मैं एक सुरक्षित कार्रवाई कॉल करने का प्रयास कर रहा हूं। यदि उपयोगकर्ता लॉग इन नहीं है, तो यह मौजूदा लॉगिन फॉर्म पर जाता है। चूंकि कार्रवाई को POST डेटा की आवश्यकता होती है, इसलिए यह पोस्ट डेटा फ़ॉर्म के साथ हस्तक्षेप कर रहा है। क्या आप इस बारे में अधिक विशिष्ट हो सकते हैं कि मुझे किस बारे में अधिक विशिष्ट होना चाहिए? – Druckles

+0

यदि उपयोगकर्ता लॉग इन नहीं है तो आप कैसे हैंडलिंग कर रहे हैं? यदि आप हेडर रीडायरेक्ट जारी करते हैं तो POST डेटा साफ़ किया जाना चाहिए। यदि आप इसके बजाय इसमें शामिल हैं, तो POST डेटा मौजूद होगा। –

उत्तर

6

यह एसएफगार्ड की कमी है, क्योंकि साइनइन कार्रवाई POST अनुरोध की जांच करेगी, और यदि फॉर्म को बाध्य करता है।

BasesfGuardActions.class.php में कोड से

:

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

मैं व्यक्तिगत रूप से सिम्फोनी में कार्रवाई के बीच अग्रेषण का एक बड़ा प्रशंसक नहीं हूँ, और सिर्फ इस मामले में की तरह, मुझे लगता है कि यह रीडायरेक्ट करने के लिए अधिक उपयुक्त है आगे से यह आपकी समस्या को हल करता है क्योंकि इसका परिणाम एक नया जीईटी अनुरोध होगा। आप 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(); 
    } 

} 

अब अनुप्रयोग में/MyApp/config/filters.yml

security: 
    class: mySecurityFilter 
0

ऐसा इसलिए है क्योंकि आप लॉगिन प्रमाणन का कोड डाल है एक ही कार्रवाई में डेटा (संभावित रूप से जांच करें कि अनुरोध पोस्ट है या नहीं)।

हालांकि आप एक क्रिया को दो कार्यों में विभाजित कर सकते हैं। एक लॉगिन फॉर्म दिखाने के लिए, और दूसरा उपयोगकर्ता के लॉगिन डेटा के लिए है। और अपनी सुरक्षित_एक्शन को उस क्रिया में सेट करें जो केवल लॉगिन फॉर्म दिखाने के लिए है।

संबंधित मुद्दे