2016-02-10 9 views
8

केस: मैं नीतियों का उपयोग कर रीढ़ की हड्डी के रूप में लार्वेल के प्राधिकरण का उपयोग करके एक मंच बना रहा हूं। मेरे द्वारा चलाए जाने वाले चेक के उदाहरण @can('view', $forum), और @can('reply', $topic), Gate::allows('create_topic', $forum) आदि जैसी चीजें हैं। ये चेक मूल रूप से जांचते हैं कि उपयोगकर्ताओं की भूमिका में विशिष्ट फ़ोरम, विषय या पोस्ट के लिए अनुमति है या नहीं। इस तरह से मैं अपने आवेदन में प्रत्येक फोरम के लिए भूमिकाएं बहुत विशिष्ट अनुमति दे सकता हूं।अतिथि उपयोगकर्ताओं के लिए प्राधिकरण और नीतियां

if (! $user = $this->resolveUser()) { 
    return false; 
} 

यह एक मुद्दा प्रस्तुत करता है जब मंचों के साथ काम:

मुद्दा यह है कि इन चेकों के सभी गेट वर्ग के माध्यम से जाना, विशेष रूप से एक विधि कहा जाता raw() इसकी पहली पंक्ति में यह करता है जो है। मेरे आवेदन के मेहमानों को मेरे मंच को देखने की भी अनुमति दी जानी चाहिए, हालांकि आप ऊपर दिए गए कोड से देख सकते हैं, यदि उपयोगकर्ता लॉग इन नहीं है तो लैरावेल गेट क्लास स्वचालित रूप से झूठी रिटर्न देता है।

मुझे अपनी नीतियों को ट्रिगर करने में सक्षम होना चाहिए भले ही कोई उपयोगकर्ता न हो। मेरे [email protected] विधि में कहें, मैं if(User::guest() && $forum->hasGuestViewAccess()) { return true }

लेकिन जैसा कि आप देख सकते हैं, यह विधि कभी भी ट्रिगर नहीं होगी।

क्या मेरे पास अभी भी अतिथि उपयोगकर्ताओं के साथ लैरवेल की प्राधिकरण सुविधा का उपयोग करने का कोई तरीका है?

उत्तर

2

मैं एक सुपर प्राकृतिक तरीका यह है, के बारे में पता नहीं कर रहा हूँ, लेकिन अगर यह आवश्यक है, तो आप फाटक के उपयोगकर्ता समाधानकर्ता, जो उपयोगकर्ताओं को खोजने (डिफ़ॉल्ट यह Auth::user() से पढ़ता द्वारा) के लिए जिम्मेदार है बदल सकता है।

चूंकि रिज़ॉल्वर संरक्षित है और इसमें कोई सेटर्स नहीं है, इसलिए आपको इसे सृजन पर संशोधित करने की आवश्यकता होगी। गेट is instantiated in Laravel's AuthServiceProvider। आप इस वर्ग को बढ़ा सकते हैं और इसके उप-वर्ग के साथ app.providers कॉन्फ़िगरेशन में संदर्भ को प्रतिस्थापित कर सकते हैं।

यह आप पर निर्भर होने के लिए अतिथि वस्तु किस तरह वापस जाने के लिए (जब तक यह truthy है के रूप में) हो रहा है, लेकिन मैं शायद एक खाली User मॉडल की तरह कुछ का उपयोग करेंगे:

protected function registerAccessGate() 
{ 
    $this->app->singleton(GateContract::class, function ($app) { 
     return new Gate($app, function() use ($app) { 
      $user = $app['auth']->user(); 
      if ($user) { 
       return $user; 
      } 
      return new \App\User; 
     }); 
    }); 
} 

आप एक जा सकते हैं आगे बढ़ें और $user->isGuest जैसे किसी विशेष संपत्ति को सेट करें, या यहां तक ​​कि एक विशेष अतिथि श्रेणी या निरंतर परिभाषित करें।

वैकल्पिक रूप से आप Auth स्तर पर अपनी प्रक्रिया को समायोजित कर सकते हैं ताकि सभी लॉग-आउट सत्र Auth::setUser($guestUserObject) पर कॉल में लिपटे हों।

+0

आप 'गेट :: फॉर यूज़र ($ guestUser)' का उपयोग कर रिज़ॉल्यूवर समस्या के आसपास भी हो सकते हैं, लेकिन यह आपके मामले में उपयोगी नहीं लगता है क्योंकि आपको अभी भी मेहमानों और उपयोगकर्ताओं के लिए अलग-अलग कोड की आवश्यकता होगी। – tdhsmith

1

मैंने अभी package जारी किया है जो अतिथि उपयोगकर्ताओं को अनुमति तर्क लागू करने की अनुमति देता है। यह null के बजाय Guest ऑब्जेक्ट को वापस करने के लिए लार्वेल के प्रमाणीकरण को थोड़ा सा संशोधित करता है जब कोई उपयोगकर्ता हल नहीं होता है। इसके अलावा प्रत्येक प्राधिकरण जांच अब प्रमाणीकरण में विफल होने की बजाय गेट को बनाता है क्योंकि प्रमाणीकृत उपयोगकर्ता नहीं है।

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