Laravel Authorization: Roles/Permissions, Gates, Policies — ব্যাখ্যা ও ব্যবহার (উদাহরণসহ) | Part 19

Abu Sayed
5 min readFeb 23, 2024

--

Laravel Auth এর এডভান্সড অনুমোদন সিস্টেম নিয়ে আলোচনা। রোল, পারমিশন, গেট, পলিসি ( Roles/Permissions, Gates, Policies ) দিয়ে কিভাবে ইউজার এবং মডেল স্পেসিফিক অনুমোদন করবেন সে সম্পর্কে বিস্তারিত আলোচনা।

আমি আপনাকে Laravel এর Auth system এর এডভান্সড ফিচারগুলো সম্পর্কে শিখিয়ে দেবো। Laravel এর অনেক সুবিধার মধ্যে Auth system একটি অন্যতম গুরুত্বপূর্ণ এবং পাওয়ারফুল ফিচার। এটি ব্যবহারকারীদের নিবন্ধন, লগইন এবং অনুমোদন করার জন্য একটি সম্পূর্ণ সল্যুশন প্রদান করে। প্রিয় বন্ধু, লারাভেলের অথরাইজেশন সিস্টেম একটি গুরুত্বপূর্ণ বিষয়। আপনাকে সেটি সম্পর্কে বিস্তারিত ধারণা দেওয়ার জন্য আমি কিছু গুরুত্বপূর্ণ বিষয় আলোচনা করবো:

অথরাইজেশন কী?

অথরাইজেশন হল একজন ব্যবহারকারীকে কোন সিস্টেমে প্রবেশ করার অনুমতি দেওয়ার প্রক্রিয়া। লারাভেলে, অথরাইজেশন প্রক্রিয়াটি সাধারণত নিম্নলিখিত উপায়ে সম্পন্ন হয়:

  • ব্যবহারকারীর পরিচয় যাচাই: ব্যবহারকারীকে তাদের পরিচয় (ইমেল এবং পাসওয়ার্ড) দিয়ে নিবন্ধন করতে হয়।
  • অনুমতি যাচাই: ব্যবহারকারীর অনুমতিগুলি যাচাই করা হয় এবং তাদের অ্যাক্সেস সীমাবদ্ধ করা হয়।
  • সেশন তৈরি: সফল অথরাইজেশনের পর ব্যবহারকারীর জন্য একটি সেশন তৈরি করা হয়।

অথরাইজেশনের প্রকারভেদ

লারাভেলে অথরাইজেশনের জন্য বিভিন্ন উপায় রয়েছে:

  1. স্কোপ অথরাইজেশন: রাউট, কন্ট্রোলার এবং মেথড স্তরে অনুমতি যাচাই।
  2. রোল অথরাইজেশন: ব্যবহারকারীদের রোল ভিত্তিক অ্যাক্সেস।
  3. গেট অথরাইজেশন: ব্যবহারকারীদের অনুমতি যাচাইয়ের জন্য গেটস ব্যবহার।
  4. পলিসি অথরাইজেশন: পলিসি ক্লাস দিয়ে অনুমতি যাচাই।

রোল অথরাইজেশন

রোল অথরাইজেশন হল ব্যবহারকারীদের তাদের রোলের উপর ভিত্তি করে অ্যাক্সেস দেওয়ার প্রক্রিয়া। এটি করার জন্য আপনাকে নিম্নলিখিত করতে হবে:

  • Role মডেল ও মাইগ্রেশন তৈরি করুন।
  • Role-এ User মডেলকে অ্যাটাচ করুন।
  • User মডেলে roles() রিলেশনশিপ যোগ করুন।
  • Gate::before() মেথডে রোল চেক করুন।
  • @role() ব্লেড ডিরেক্টিভ ব্যবহার করে রোল ভিত্তিক অ্যাক্সেস প্রতিরোধ করুন।

গেট অথরাইজেশন

গেটস হল লারাভেলের অনুমতি যাচাইয়ের জন্য একটি সুবিধা। এটি ব্যবহার করে আপনি নিম্নলিখিত করতে পারেন:

  • App\Providers\AuthServiceProvider এ গেটস রেজিস্টার করুন।
  • Gate::define() দিয়ে গেটস ডিফাইন করুন।
  • Gate::allows() দিয়ে অনুমতি চেক করুন।
  • @can এবং @cannot ব্লেড ডিরেক্টিভ ব্যবহার করুন।

পলিসি অথরাইজেশন

পলিসি ক্লাস ব্যবহার করে লজিক্‌যালি অনুমতি যাচাই করা যায়। এর জন্য:

  • App\Policies\ModelPolicy ক্লাস তৈরি করুন।
  • Policy রেজিস্টার করুন।
  • authorize() এবং অন্যান্য মেথড ডিফাইন করুন।
  • Gate::policy() দিয়ে পলিসি লিঙ্ক করুন।
  • @can ব্লেড ডিরেক্টিভ ব্যবহার করুন।

অনুমোদন (Authorization)

লগইন হয়ে গেলেও সকল ইউজারের সমান অ্যাক্সেস থাকে না। একজন সাধারণ ইউজারের এবং একজন অ্যাডমিনের অ্যাক্সেস পৃথক হয়। Authorization ব্যবহার করে আমরা ইউজারদের অনুযায়ী অ্যাক্সেস নিয়ে তর্ক করে দিতে পারি। Laravel এ আমরা এই Authorization করতে পারি:

১. Roles এবং Permissions

Roles এবং Permissions ব্যবহার করে ইউজারদের গ্রুপে ভাগ করে পৃথক পৃথক অ্যাক্সেস দেয়া যায়। যেমন Admin, Editor, User ইত্যাদি।

২. Gates

Gates হলো ইউজার স্পেসিফিক অ্যাকশনকে অনুমোদন করার জন্য ক্লাস বেইজড অ্যাপ্রোচ।

৩. Policies

Policies হলো মডেল স্পেসিফিক অনুমোদন। একটি মডেলের জন্য কোন ইউজার কোন অ্যাকশন করতে পারবে সেটা নির্ধারণ করে Policies।

আসুন এগুলো একএকটি করে বিস্তারিত দেখা যাক।

Roles and Permissions

Roles এবং Permissions দিয়ে আমরা ইউজারদের groups হিসেবে ভাগ করে দিতে পারি এবং প্রতিটি গ্রুপের জন্য permissions সেট করে দিতে পারি।

উদাহরণস্বরূপ:

  • Admin গ্রুপের সকল রিসোর্সে পূর্ণ অ্যাক্সেস থাকবে।
  • Editor গ্রুপ শুধুমাত্র পোস্ট করতে এবং সম্পাদনা করতে পারবে।
  • User গ্রুপ শুধু পোস্ট দেখতে পারবে।

এভাবে প্রতিটি গ্রুপের জন্য আলাদা আলাদা permissions সেট করা যায়।

কিভাবে ইমপ্লিমেন্ট করবো

Roles এবং Permissions ইমপ্লিমেন্ট করতে আমাদের প্রথমেই দুটি মডেল তৈরি করতে হবে:

// Role Model
namespace App\Models;use Illuminate\Database\Eloquent\Model;class Role extends Model
{
//
}
// Permission Modelnamespace App\Models;use Illuminate\Database\Eloquent\Model;class Permission extends Model
{
//
}

এরপর migrations দিয়ে দুটি টেবিল তৈরি করবো roles এবং permissions

টেবিলে থাকবে:

roles

  • id
  • name
  • description

permissions

  • id
  • name
  • description

এরপর আমাদের User model এ দুটি রিলেশনশিপ যোগ করতে হবে যাতে ইউজার একাধিক রোল এবং পারমিশন পাইতে পারে:

public function roles()
{
return $this->belongsToMany(Role::class);
}
public function permissions() 
{
return $this->belongsToMany(Permission::class);
}

এবার ইউজার তৈরির সময় তার roles এবং permissions এসাইন করতে হবে:

$user = User::create([
'name' => 'John Doe',
'email' => 'john@example.com',
'password' => Hash::make('password')
]);
$user->roles()->attach(1); // attach role id
$user->permissions()->attach(1); // attach permission id

অনুমোদন চেক করার সময়:

// Check for role
$user->hasRole('admin');
// Check for permission
$user->hasPermissionTo('edit_posts');

এভাবে খুব সহজেই Roles এবং Permissions দিয়ে Authorization করা যায়।

Gates

Gates হলো ইউজার স্পেসিফিক একটি অ্যাকশন পারফর্ম করার অনুমতি আছে কিনা সেটা চেক করার জন্য ব্যবহৃত হয়। এটি সাধারণত ক্লাস বেইজড হয়।

উদাহরণ:

class PostPolicy
{
public function update(User $user, Post $post)
{
return $user->id === $post->user_id;
}
}

এখানে update মেথডটি চেক করছে সেই ইউজারই কি সেই পোস্টটির মালিক, যদি হ্যাঁ হয় তাহলে ইউজারকে update করার অনুমতি দিবে।

Gates ব্যবহার করার সময়:

if (Gate::allows('update', $post)) {
// User can update the post
}

Gates হলো ইউজার স্পেসিফিক কোন অ্যাকশন করতে পারবে কিনা সেটা চেক করার জন্য খুবই পাওয়ারফুল।

Policies

Policies হলো মডেল স্পেসিফিক অনুমোদন চেকার সিস্টেম। প্রতিটি মডেলের জন্য আলাদা করে Policy class লিখে সেখানে যে ইউজার কোন অ্যাকশন করতে পারবে সেগুলো লিখে দেওয়া হয়।

উদাহরণ:

class PostPolicy {
  public function update(User $user, Post $post)
{
return $user->id === $post->user_id;
}
}

এখানে পোস্ট মডেলের জন্য Policy লিখে update মেথডে চেক করা হচ্ছে সেই ইউজারই কি সেই পোস্টটির মালিক।

এরপর Controller থেকে এর ব্যবহার:

public function update(Request $request, Post $post) 
{
$this->authorize('update', $post);
  // update post
}

কিভাবে Policy রেজিস্টার করবো

প্রতিটি মডেলের জন্য আলাদা করে Policy class লিখে সেগুলো রেজিস্টার করে দিতে হবে। একটি উদাহরণ:

// PostPolicy
public function update(User $user, Post $post)  
{
return $user->id === $post->user_id;
}
// Register in AuthServiceProviderpublic function boot()
{
$this->registerPolicies();
// or manually
Policy::register(Post::class, PostPolicy::class);
}

এভাবে প্রতিটি মডেলের জন্য Policy ক্লাস লিখে রেজিস্টার করলে সেগুলো দিয়ে সহজেই অনুমোদন চেক করা যায়।

সামঞ্জস্যতা

এই তিনটি অনুমোদন পদ্ধতির মধ্যে Roles & Permissions হলো সবচেয়ে সহজ এবং সাধারণ রকমের অনুমোদনের জন্য উপযোগী।

Gates বেশি করে ইউজার স্পেসিফিক একটি অ্যাকশন অনুমোদনের জন্য ভালো।

আর Policies হলো মডেল স্পেসিফিক অনুমোদনের জন্য সবচেয়ে ভালো।

এই তিনটির মধ্যে প্রয়োজনে মতো কোনটি ব্যবহার করলেই ভালো। আর একসাথেও ব্যবহার করা যেতে পারে।

সারাংশ

  • Laravel এর Auth system এ অনুমোদন করার জন্য Roles, Gates এবং Policies ব্যবহার করা হয়।
  • Roles দিয়ে ইউজারদের groups হিসেবে ভাগ করে permissions set করা যায়।
  • Gates দিয়ে ইউজার স্পেসিফিক অ্যাকশন চেক করা যায়।
  • Policies দিয়ে প্রতিটি মডেলের জন্য ইউজারের কী পারমিশন আছে সেটা চেক করা যায়।
  • প্রয়োজনে মতো এই তিনটির যেকোনটি বা একসাথেও ব্যবহার করা যায়।

এভাবে Laravel এর Auth system এর advanced ফিচারগুলো ব্যবহার করে সহজেই শক্তিশালী অনুমোদন সিস্টেম তৈরি করা যায়।

আশা করি এই লেখাটি লারাভেল অথরাইজেশন সম্পর্কে ধারণা পেতে সাহায্য করেছে। আপনার কোন প্রশ্ন থাকলে জানাতে অস্বস্তি বোধ করবেন না।

--

--

Abu Sayed

Bangladeshi Full Stack Web Dev, Sys Admin & DevOps Engineer. Skills: Data analysis, SQL, Kubernetes. Python, PHP & Laravel. Me on: bd.linkedin.com/in/imabusayed