2015-09-12 9 views
12

मैं अपने ऐप के लिए एक कुशल और लचीला आरबीएसी समाधान के साथ आने की कोशिश कर रहा हूं। मैंने थोड़ा सा शोध किया है और लगता है कि मैंने निम्नलिखित बनाया है।लार्वेल 5 भूमिका आधारित अभिगम नियंत्रण

मेरे उपयोगकर्ता मॉडल में मेरे पास है:

... 
public function role() { 
     return $this->belongsToMany('App\Models\Role', 'user_roles'); 
    } 

    public function hasRole($role) { 
     if($this->role->where('name', $role)->first()) 
      return true; 
    } 
... 

और उपयोग का एक उदाहरण:

Route::group(['middleware' => 'auth'], function() { 

    Route::get('/dashboard', function() { 
     if (Auth::user()->hasRole('Sales')) { 
      return view('dashboards/sales'); 
     } else { 
      return 'Don\'t know where to send you :('; 
     } 
    }); 

}); 

अनुमतियां भूमिकाओं के लिए आवंटित कर रहे हैं, लेकिन अनुमतियाँ ऊपर के उदाहरण में जाँच नहीं कर रहे हैं। भूमिकाओं को तब उपयोगकर्ताओं को सौंपा जाता है और उपयोगकर्ता के पास कई भूमिकाएं हो सकती हैं।

क्या मैंने जिस तरह से स्केल करने योग्य और प्रभावी आरबीएसी समाधान किया है?

+3

5.1.11 प्राधिकरण ने क्षमताओं और नीतियों का उपयोग कर में दी गई है। क्या वे आपकी आवश्यकताओं को पूरा कर सकते हैं? http://laravel.com/docs/5.1/authorization .. आप ENTRUST को आजमा सकते हैं हालांकि https://github.com/Zizaco/entrust – e4rthdog

+0

धन्यवाद, केवल एक चीज यह नहीं बताती है कि कैसे करना है यह कैसे करना है डेटाबेस का उपयोग कर कुछ उपयोगकर्ताओं को क्षमताओं। – imperium2335

+0

इसके बजाय आप उपयोगकर्ता मॉडल के माध्यम से क्षमता की जांच करते हैं ... http: //laravel.com/docs/5.1/authorization#defining-abilities – e4rthdog

उत्तर

3

मैंने कुछ RBAC ऐप्स बनाए हैं, और यह आपके द्वारा सामना किए जाने वाले चुनौती पर निर्भर करता है, उदाहरण के लिए

उपयोगकर्ता एक भूमिका है लेकिन आप एक है कि एक विशिष्ट उपयोगकर्ता, कुछ क्षेत्र के लिए उपयोग किया Posts की तरह, अब उपयोगकर्ता एक संचालक की तरह पोस्ट को संपादित कर सकते हैं। इस मामले में अनुमति दृष्टिकोण केवल एक भूमिका दृष्टिकोण से बेहतर है।

एक स्लग द्वारा उपयोग को परिभाषित करें, अन्य क्षेत्रों सुपर व्यवस्थापक, या विडंबना यह है कि एक संपादक भूमिका, अब शुरू करने, एक संपादक भूमिका प्लस अनुमति एक नया "क्षेत्र" करने के लिए के लिए के लिए एक संदर्भ के रूप में इस्तेमाल किया जा सकता।

public function up() 
{ 
    Schema::create('permissions', function (Blueprint $table) { 
     $table->increments('id')->unsigned(); 
     $table->string('name'); 
     $table->string('slug')->unique(); 
     $table->string('description')->nullable(); 
     $table->string('model')->nullable(); 
    }); 
} 

सामग्री डेटा के उदाहरण के रूप में,

$createUsersPermission = Permission::create([ 
    'name' => 'Create permissions', 
    'slug' => 'create.permissions', 
    ... 
]); 

और उपयोग का एक उदाहरण:

if ($user->can('create.permissions') { // you can pass an id or slug 
    // 
} 

निजी तौर पर preference, और कभी नहीं Zizaco Entrust इस्तेमाल किया के रूप में अन्य लोगों ने सुझाव दिया है, लेकिन यह काम करता है उसी तरह से। इसके अलावा आपके पास स्तर भी है।

3

मैंने थोड़ा अलग किया, मैंने UserRole में हैरोल बनाया, उपयोगकर्ता नहीं है (बहुत अधिक प्रभाव नहीं पड़ता है लेकिन कोड के अनुसार यह होना चाहिए)। तो यहां मेरा मार्ग है:

Route::group(['middleware' => 'auth'], function() { 
Route::get('/myProfile', function() { 
    if (App\UserRole::hasRole('ROLE_CUSTOMER',Auth::user())) { 
     return view('views/customer'); 
    } else { 
     return 'Don\'t know where to send you :('; 
    } 
}); }); 

अगला बात यह है कि, मेरे उपयोगकर्ता रोल में विधि है। मैं इसे आसान बनाने का प्रयास:

public static function hasRole($authority,$user) { 
     $role = Role::where('authority',$authority)->first(); 
     $userRole = UserRole::where('role_id',$role->id) 
        ->where('user_id',$user->id)->first(); 
     if($userRole){ 
      return true; 
     } 
    } 

हम प्राधिकारी (ROLE_USER, ROLE_CUSTOMER आदि) के लिए देखो और उपयोगकर्ता $ उपयोगकर्ता DB से लिया गया ऑब्जेक्ट है। बाकी सब कुछ आपके प्रश्न/ के अनुसार चलता है उम्मीद है कि यह मदद करता है! चीयर्स!

0

चूंकि लार्वेल में भूमिका आधारित प्रमाणीकरण के लिए बॉक्स समाधान से बाहर नहीं है। आप एक कस्टम रोल टेबल बना सकते हैं जो आपके आवेदन की सभी संभावित भूमिकाओं को परिभाषित करता है, और role_user तालिका जिसमें उपयोगकर्ता और भूमिकाओं का संबंध होता है।

आप अपने उपयोगकर्ता मॉडल के तहत विधियों को बना सकते हैं ताकि यह जांच सके कि उपयोगकर्ता किसी विशेष भूमिका से संबंधित है या नहीं। एक नया मिडलवेयर पंजीकृत करने के लिए उस विधि का उपयोग करें। मार्गवेयर या नियंत्रकों के लिए मिडलवेयर अटैच हो सकता है।

विस्तृत डेमो इस लिंक https://www.5balloons.info/user-role-based-authentication-and-access-control-in-laravel/

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