2013-08-18 21 views
6

में HTTP बेसिक एथ के साथ लॉग आउट करना मेरे पास एक उपयोगकर्ता श्रेणी है जिसमें दो प्रकार के उपयोगकर्ता होते हैं और विभिन्न उपयोगकर्ताओं को विभिन्न पृष्ठों पर जाने की अनुमति देना चाहते हैं। यदि यह एक विशेषज्ञ नहीं है, यह लॉग आउट करने और प्रवेश पृष्ठ पर रीडायरेक्ट करेगा:लार्वेल

मैं मार्ग की तरह तो

Route::get('/winners', array('before' => 'isExpert', function() 
{ 
    $winners = DB::select('select * from winners'); 
    return View::make('winners.index')->with('winners',$winners); 
})); 

सोचा यह है के रूप में

Route::filter('isExpert', function() 
{ 
    $userIsExpert = 0; 
    $userIsLoggedIn = Auth::check(); 
    if ($userIsLoggedIn && Auth::user()->role == 'expert') { 
    $userIsExpert = 1; 
    } 

    Log::info('Logged in: ' . $userIsLoggedIn . ' && Expert: ' . $userIsExpert); 
    if ($userIsExpert == 0) 
    { 
     Log::info('should be logging out now.'); 
     Auth::logout(); 
     return Auth::basic(); 
    } 
}); 

इस प्रकार एक फिल्टर बनाया है और। यदि ऐसा है, तो यह बस जारी रहेगा। हालांकि, एथ :: लॉगआउट(); कभी उपयोगकर्ता को लॉग आउट नहीं करता है।

प्रश्न

क्यों प्रमाणन नहीं है :: लॉगआउट() काम कर रहा? मैंने ऐप में कहीं भी इसका लाभ उठाने की कोशिश की है।

चियर्स

+1

'Auth :: मूल()' प्रतिक्रिया वापस करने के बजाय किसी भिन्न मार्ग पर रीडायरेक्ट करने का प्रयास करें। तकनीकी रूप से आपका कोड काम करना चाहिए।लॉगआउट के ठीक से काम करने के बाद आप लॉगआउट के बाद 'डीडी (एथ :: चेक())' भी कोशिश कर सकते हैं। –

+0

ठीक है। रीडायरेक्ट फ़ंक्शन काम करता है, मैं वहां एक दृश्य डाल सकता हूं और यह इसे बंद कर देता है। एथ :: लॉगआउट() ऐप में कहीं भी काम नहीं करता है। कोई विचार क्यों? –

उत्तर

7

मैं एक ही समस्या थी, मैं वास्तव में वर्तमान उपयोगकर्ता लॉगआउट नहीं कर सकता है ... और इस सवाल का जवाब आसान है: Laravel प्रमाणीकरण के साथ लॉगआउट() :: बुनियादी समर्थन नहीं करता है()।

इसे ठीक करने के तरीके हैं, लेकिन यह बहुत साफ नहीं है; https://www.google.nl/search?q=logout+basic

3

मुझे इसके लिए सबसे आसान तरीका लॉगआउट रूट पर अमान्य उपयोगकर्ता नाम/पासवर्ड पर रीडायरेक्ट करना है। उदाहरण:

Route::get('admin/logout', function() { 
    return Redirect::to(preg_replace("/:\/\//", "://log-me-out:[email protected]", url('admin/logout'))); 
}); 
+0

जब भी मैं इसे आज़माता हूं, मुझे 500 सर्वर त्रुटि मिलती है क्योंकि यह रीडायरेक्ट लूप में है। – Kingsley

3

यह लैरवेल की सीमा नहीं है, HTTP मूल प्रमाणीकरण लॉगिंग को संभालने के लिए डिज़ाइन नहीं किया गया है। ब्राउज़र बंद होने तक ग्राहक लॉग इन रहेगा।

HTTP मूल प्रमाणीकरण वास्तव में किसी भी सार्वजनिक उत्पादन वातावरण में उपयोग नहीं किया जाना चाहिए। यहां कुछ कारण दिए गए हैं:

  • उपयोगकर्ताओं को "मुझे याद रखें" - लॉगिन फ़ॉर्म पर विकल्प देने का कोई तरीका नहीं है।
  • पासवर्ड प्रबंधकों के पास HTTP बेसिक ऑथ के लिए कोई समर्थन नहीं है या नहीं, क्योंकि यह HTML को प्रस्तुत नहीं किया गया है बल्कि मूल पॉपअप है।
  • भयानक उपयोगकर्ता अनुभव। एक उचित लॉगिन फॉर्म को एक साथ रखना थोड़ा सा समय लगता है।

एकमात्र वैध मामला जो मैं सोच सकता हूं वह सार्वजनिक विकास-सबडोमेन जैसे dev.example.com की रक्षा करना है, लेकिन इसे हल करने के बेहतर तरीके भी हैं।

0

आप User.php

में इन तरीकों को लागू किया तो
/** 
* Get the e-mail address where password reminders are sent. 
* 
* @return string 
*/ 
public function getReminderEmail() 
{ 
    return $this->email; 
} 

public function getRememberToken() 
{ 
    return $this->remember_token; 
} 

public function setRememberToken($value) 
{ 
    $this->remember_token = $value; 
} 
    public function getRememberTokenName() 
{ 
    return 'remember_token'; 
} 

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

ALTER TABLE users ADD remember_token TEXT; 

और उसके बाद 'गो' बटन।