दिलचस्प पोस्ट
JSP के माध्यम से प्रदर्शन ब्लॉब (इमेज) MVC पर कई रिश्ते डेटा को सहेजना दृश्य को देखें पायथन में टाइम ज़ोन संक्षिप्त नाम के साथ दिनांक / समय स्ट्रिंग पार्स करना? फ़ेविकॉन – सर्वश्रेष्ठ अभ्यास कीप्रेस पढ़ने के लिए पायथन विधि? यह जांच क्यों! = नल? जेपीईजी मेटाडाटा (अभिविन्यास) पढ़ने में समस्या छवि के माध्यम से परिपत्र में xml किसी भी गहराई पर नाम के तत्वों के लिए XDocument क्वेरी करें WinForms ऐप में कस्टम शीर्षकबार / क्रोम उस डिवीवल को रीफ़्रेश करें जिसमें उसके अंदर एक Google विज्ञापन है जेएसएफ एमवीसी ढांचे में एमवीसी क्या घटक हैं? अब जोडा-टाइम के साथ बीत चुके समय की गणना कैसे करें? ओरेकल में एक अस्थायी तालिका कैसे तैयार करें यादृच्छिक भारित विकल्प

2 विभिन्न तालिकाओं के साथ प्रमाणीकरण

मुझे दूसरी तालिका और उपयोगकर्ताओं के साथ एक नया "auth" कॉन्फ़िग बनाने की आवश्यकता है मेरे पास "व्यवस्थापक" उपयोगकर्ताओं के लिए एक मेज है और सामान्य उपयोगकर्ताओं के लिए दूसरी तालिका है।

लेकिन मैं एक अलग कॉन्फ़िगरेशन के साथ Auth का एक और उदाहरण कैसे बना सकता हूँ?

वेब के समाधान से एकत्रित समाधान "2 विभिन्न तालिकाओं के साथ प्रमाणीकरण"

आप एक नया एथ क्लास "अनुकरण" कर सकते हैं।

Laravel Auth घटक मूलतः Illuminate\Auth\Guard वर्ग है, और इस वर्ग में कुछ निर्भरताएं हैं

तो, मूल रूप से आपको एक नया गार्ड वर्ग और कुछ मुखौटे बनाने होंगे …

 <?php use Illuminate\Auth\Guard as AuthGuard; class CilentGuard extends AuthGuard { public function getName() { return 'login_' . md5('ClientAuth'); } public function getRecallerName() { return 'remember_' . md5('ClientAuth'); } } 

… इस वर्ग को प्रारंभ करने के लिए एक ServiceProvider को जोड़ना, इसे निर्भरताएं पारित करना

 <?php use Illuminate\Support\ServiceProvider; use Illuminate\Auth\EloquentUserProvider; use Illuminate\Hashing\BcryptHasher; use Illuminate\Auth\Reminders\PasswordBroker; use Illuminate\Auth\Reminders\DatabaseReminderRepository; use ClientGuard; use ClientAuth; class ClientServiceProvider extends ServiceProvider { public function register() { $this->registerAuth(); $this->registerReminders(); } protected function registerAuth() { $this->registerClientCrypt(); $this->registerClientProvider(); $this->registerClientGuard(); } protected function registerClientCrypt() { $this->app['client.auth.crypt'] = $this->app->share(function($app) { return new BcryptHasher; }); } protected function registerClientProvider() { $this->app['client.auth.provider'] = $this->app->share(function($app) { return new EloquentUserProvider( $app['client.auth.crypt'], 'Client' ); }); } protected function registerClientGuard() { $this->app['client.auth'] = $this->app->share(function($app) { $guard = new Guard( $app['client.auth.provider'], $app['session.store'] ); $guard->setCookieJar($app['cookie']); return $guard; }); } protected function registerReminders() { # DatabaseReminderRepository $this->registerReminderDatabaseRepository(); # PasswordBroker $this->app['client.reminder'] = $this->app->share(function($app) { return new PasswordBroker( $app['client.reminder.repository'], $app['client.auth.provider'], $app['redirect'], $app['mailer'], 'emails.client.reminder' // email template for the reminder ); }); } protected function registerReminderDatabaseRepository() { $this->app['client.reminder.repository'] = $this->app->share(function($app) { $connection = $app['db']->connection(); $table = 'client_reminders'; $key = $app['config']['app.key']; return new DatabaseReminderRepository($connection, $table, $key); }); } public function provides() { return array( 'client.auth', 'client.auth.provider', 'client.auth.crypt', 'client.reminder.repository', 'client.reminder', ); } } 

इस सेवा प्रदाता में, मैंने उदाहरण दिया है कि कैसे एक नया पासवर्ड रिमाइंडर घटक बनाने के लिए।

अब आपको दो नए facades बनाने की आवश्यकता है, प्रमाणीकरण के लिए एक और पासवर्ड अनुस्मारक के लिए।

 <?php use Illuminate\Support\Facades\Facade; class ClientAuth extends Facade { protected static function getFacadeAccessor() { return 'client.auth'; } } 

तथा…

 <?php use Illuminate\Support\Facades\Facade; class ClientPassword extends Facade { protected static function getFacadeAccessor() { return 'client.reminder'; } } 

बेशक, पासवर्ड अनुस्मारक के लिए, आपको डेटाबेस में टेबल बनाने की ज़रूरत है, ताकि काम कर सके। इस उदाहरण में, तालिका का नाम client_reminders होना चाहिए, क्योंकि आप सेवा प्रदाता में registerReminderDatabaseRepository विधि में देख सकते हैं। तालिका संरचना मूल अनुस्मारक तालिका के समान है

उसके बाद, आप अपने ClientAuth का उपयोग उसी तरह कर सकते हैं जिस तरह से आप Auth क्लास का उपयोग करते हैं। और Password क्लास के साथ ClientPassword Password लिए यही बात।

 ClientAuth::gust(); ClientAuth::attempt(array('email' => $email, 'password' => $password)); ClientPassword::remind($credentials); 

app/config/app.php फ़ाइल में सेवा प्रदाता सूची में अपने सेवा प्रदाता को जोड़ने के लिए मत भूलना

अद्यतन करें:

यदि आप Laravel 4.1 का उपयोग कर रहे हैं, तो पासवर्डबॉकर को पुन: डायरेक्ट वर्ग की आवश्यकता नहीं है।

 return new PasswordBroker( $app['client.reminder.repository'], $app['client.auth.provider'], $app['mailer'], 'emails.client.reminder' // email template for the reminder ); 

2 अद्यतन करें

Laravel 5.2 ने मल्टी ऑथ की शुरुआत की, इसलिए अब इस संस्करण में इसकी आवश्यकता नहीं है।

इस समस्या को हल करने की कोशिश करते हुए, मुझे एक बहुत ही आसान तरीका मिला। मैं मूल रूप से एक कस्टम सेवा प्रदाता को मूल एथ एक को बदलने के लिए बनाया है, जो कि एथ के लिए फ़ैक्टरी क्लास के रूप में कार्य करता है, और आपको एकाधिक लॉगिन प्रकारों के लिए कई उदाहरण हैं। मैंने यह भी एक पैकेज में रख दिया है जो यहां पाया जा सकता है: https://github.com/ollieread/multiauth

वास्तव में उपयोग करना बहुत आसान है, बस ओथिय्रेड \ मल्टीआईथ \ MultiauthServiceProvider के साथ ऐप / कॉन्फ़िग / एपी.पीपी में AuthServiceProvider की जगह ले, फिर ऐप / config / auth.php को इस तरह से देखने के लिए बदलें:

 return array( 'multi' => array( 'account' => array( 'driver' => 'eloquent', 'model' => 'Account' ), 'user' => array( 'driver' => 'database', 'table' => 'users' ) ), 'reminder' => array( 'email' => 'emails.auth.reminder', 'table' => 'password_reminders', 'expire' => 60, ), ); 

अब आप पहले से ही उसी तरह एथ का उपयोग कर सकते हैं, लेकिन एक मामूली अंतर के साथ:

 Auth::account()->attempt(array( 'email' => $attributes['email'], 'password' => $attributes['password'], )); Auth::user()->attempt(array( 'email' => $attributes['email'], 'password' => $attributes['password'], )); Auth::account()->check(); Auth::user()->check(); 

यह आपको कई यूजर प्रकारों के रूप में लॉग इन करने की भी अनुमति देता है जो कि एक प्रोजेक्ट की आवश्यकता थी जिसे मैं काम कर रहा था। आशा है कि यह मेरे अलावा किसी और को मदद करता है

अपडेट – 27/02/2014

उन लोगों के लिए जो इस उत्तर में बस आ रहे हैं, मैंने हाल ही में रिमाइंडर्स के लिए समर्थन जोड़ा है, जिसे एक ही कारखाना शैली के तरीके में पहुंचा जा सकता है।

ठीक है, मुझे एक ही समस्या थी और यहां बताया कि मैंने इसे कैसे सुलझाया है:

वास्तव में लारवेल 4 में आप बस रनटाइम पर ऑथिफ कॉन्फिग्स को बदल सकते हैं ताकि आप अपने ऐप में निम्नलिखित कर सकते हैं: फिल्टर से पहले:

 if ($request->is('admin*')) { Config::set('auth.model', 'Admin'); } 

यह प्राधिकृत घटक को एडमिन मॉडल मॉडल का उपयोग करने के लिए बना देगा जब व्यवस्थापक यूआरएल में। लेकिन यह एक नई समस्या का कारण बन जाएगा, क्योंकि प्रवेश सत्र की कुंजी समान होती है यदि आपके पास दो उपयोगकर्ता आपके व्यवस्थापक और उपयोगकर्ता तालिका में एक ही आईडी के साथ हैं, तो आप व्यवस्थापक साइट में लॉग इन करने में सक्षम होंगे यदि आपने पहले लॉग इन किया है नियमित उपयोगकर्ता! इसलिए मैं पूरी तरह से दो अलग-अलग ऑथिटेक्शन बनाने के लिए इस चाल को बनाया:

 class AdminGuard extends Guard { public function getName() { return 'admin_login_'.md5(get_class($this)); } public function getRecallerName() { return 'admin_remember_'.md5(get_class($this)); } } Auth::extend('eloquent.admin', function() { return new AdminGuard(new EloquentUserProvider(new BcryptHasher, 'Admin'), App::make('session.store')); }); 

और ऐप :: कोड को बदलने से पहले:

 if ($request->is('admin*')) { Config::set('auth.driver', 'eloquent.admin'); Config::set('auth.model', 'Admin'); } 

आप देख सकते हैं कि मैंने एक नया auth ड्रायवर बनाया है और गार्ड कक्षा में कुछ विधियों को फिर से लिखा है ताकि यह व्यवस्थापक साइट के लिए अलग-अलग सत्र कुंजियां उत्पन्न करे। तो मैंने व्यवस्थापक साइट के लिए ड्राइवर को बदल दिया। सौभाग्य।

कल ही एक समस्या थी, और मैंने एक बहुत ही सरल समाधान का निर्माण किया।

मेरी आवश्यकताओं जहां दो अलग अलग डेटाबेस में 2 विभिन्न तालिकाओं एक टेबल प्रशासकों के लिए थी, अन्य सामान्य उपयोगकर्ताओं के लिए थी इसके अलावा, प्रत्येक तालिका में हिसिंग का अपना तरीका था मैं निम्नलिखित के साथ समाप्त हुआ (कोड भी Github पर एक सार के रूप में उपलब्ध है: https://gist.github.com/Xethron/6790029 )

एक नया UserProvider बनाएं मैंने अपने मल्टीयूजर प्रोव्हाइडर। Php को बुलाया

 <?php // app/libraries/MultiUserProvider.php use Illuminate\Auth\UserProviderInterface, Illuminate\Auth\UserInterface, Illuminate\Auth\GenericUser; class MultiUserProvider implements UserProviderInterface { protected $providers; public function __construct() { // This should be moved to the config later... // This is a list of providers that can be used, including // their user model, hasher class, and hasher options... $this->providers = array( 'joomla' => array( 'model' => 'JoomlaUser', 'hasher' => 'JoomlaHasher', ) 'another' => array( 'model' => 'AnotherUser', 'hasher' => 'AnotherHasher', 'options' => array( 'username' => 'empolyee_number', 'salt' => 'salt', ) ), ); } /** * Retrieve a user by their unique identifier. * * @param mixed $identifier * @return \Illuminate\Auth\UserInterface|null */ public function retrieveById($identifier) { // Returns the current provider from the session. // Should throw an error if there is none... $provider = Session::get('user.provider'); $user = $this->createModel($this->providers[$provider]['model'])->newQuery()->find($identifier); if ($user){ $user->provider = $provider; } return $user; } /** * Retrieve a user by the given credentials. * * @param array $credentials * @return \Illuminate\Auth\UserInterface|null */ public function retrieveByCredentials(array $credentials) { // First we will add each credential element to the query as a where clause. // Then we can execute the query and, if we found a user, return it in a // Eloquent User "model" that will be utilized by the Guard instances. // Retrieve the provider from the $credentials array. // Should throw an error if there is none... $provider = $credentials['provider']; $query = $this->createModel($this->providers[$provider]['model'])->newQuery(); foreach ($credentials as $key => $value) { if ( ! str_contains($key, 'password') && ! str_contains($key, 'provider')) $query->where($key, $value); } $user = $query->first(); if ($user){ Session::put('user.provider', $provider); $user->provider = $provider; } return $user; } /** * Validate a user against the given credentials. * * @param \Illuminate\Auth\UserInterface $user * @param array $credentials * @return bool */ public function validateCredentials(UserInterface $user, array $credentials) { $plain = $credentials['password']; // Retrieve the provider from the $credentials array. // Should throw an error if there is none... $provider = $credentials['provider']; $options = array(); if (isset($this->providers[$provider]['options'])){ foreach ($this->providers[$provider]['options'] as $key => $value) { $options[$key] = $user->$value; } } return $this->createModel($this->providers[$provider]['hasher']) ->check($plain, $user->getAuthPassword(), $options); } /** * Create a new instance of a class. * * @param string $name Name of the class * @return Class */ public function createModel($name) { $class = '\\'.ltrim($name, '\\'); return new $class; } } 

उसके बाद, मैंने अपने app/start/global.phpapp/start/global.php फ़ाइल के शीर्ष पर निम्न पंक्तियां जोड़कर अपने यूज़रप्रोवाइडर के बारे में Laravel को बताया।

 // app/start/global.php // Add the following few lines to your global.php file Auth::extend('multi', function($app) { $provider = new \MultiUserProvider(); return new \Illuminate\Auth\Guard($provider, $app['session']); }); 

और फिर, मैंने Laravel को app/config/auth.php प्रदाता के app/config/auth.php बजाय अपने उपयोगकर्ता प्रदाता का उपयोग करने के लिए कहा

 'driver' => 'multi', 

अब, जब मैं प्रमाणित करता हूं, तो मैं ऐसा करता हूं:

 Auth::attempt(array( 'email' => $email, 'password' => $password, 'provider'=>'joomla' ) ) 

क्लास तब जूमलाउसर मॉडल का इस्तेमाल करेगा, जिसमें जूमला हैशर और हैशर के लिए कोई विकल्प नहीं होगा … अगर 'अन्य' प्रदाता का उपयोग कर रहे हैं, इसमें हैशर के लिए विकल्प शामिल होंगे

इस वर्ग को मैं क्या जरूरत के लिए बनाया गया था, लेकिन आसानी से आपकी आवश्यकताओं के अनुसार परिवर्तित किया जा सकता है

पुनश्च: सुनिश्चित करें कि autoloader MultiUserProvider पा सकते हैं, अन्यथा यह काम नहीं करेगा।

मैं एकाधिक उपयोगकर्ता तालिकाओं को प्रबंधित करने के लिए Laravel 5 मूल एथ का उपयोग कर रहा हूं …

यह मुश्किल नहीं है, कृपया इस चेक को देखें:

https://gist.github.com/danielcoimbra/64b779b4d9e522bc3373

अद्यतन: Laravel 5 के लिए, यदि आपको अधिक मजबूत समाधान की आवश्यकता है, तो इस पैकेज का प्रयास करें:

https://github.com/sboo/multiauth

डैनियल