Recents in Beach

Spatie - Laravel Permission

 Introduction

এখানে যা বলা হয়েছে তা হলো Permission এবং Role-এর মধ্যে সম্পর্ক স্থাপন করার দুটি উপায়। এই রোলটি এই পারমিশনটি পাবে

// Adding permissions to a user
$user->givePermissionTo('edit articles');
// Adding permissions via a role
$user->assignRole('writer');
$role->givePermissionTo('edit articles');

১️ $user->givePermissionTo('edit articles');

👉 এই user নিজে নিজে একটা কাজের অনুমতি পেল।

মানে:
ইব্রাহিম এখন সরাসরি edit articles করতে পারবে।

➡ এখানে role দরকার নেই
➡ সরাসরি permission দেওয়া হয়েছে


২️ $role->givePermissionTo('edit articles');

👉 একটা role কে permission দেওয়া হলো।

মানে:
যে কেউ এই role পাবে, সে এই কাজ করতে পারবে।


৩️ $user->assignRole('writer');

👉 user কে একটা role দেওয়া হলো।

মানে:
ইব্রাহিম এখন writer হলো।

আর যদি writer role এ আগে থেকেই
edit articles permission থাকে —

তাহলে ইব্রাহিমও automatically edit করতে পারবে


আপনি Laravel-এ $user->can('edit articles'); ব্যবহার করলে এর মানে হলো:

“এই $user ব্যবহারকারীটির ‘edit articles’ পারমিশন আছে কিনা তা পরীক্ষা করা।”

বাংলায় বিস্তারিত ব্যাখ্যা:

  1. $user – এটি আপনার ব্যবহারকারী অবজেক্ট, সাধারণত User মডেল।

  2. can('edit articles')can হলো Laravel বা Spatie Permission প্যাকেজের মেথড, যা চেক করে ব্যবহারকারীর কাছে নির্দিষ্ট পারমিশন আছে কি না। এখানে 'edit articles' হলো পারমিশনের নাম।

  3. ফলাফল – এটি Boolean (true/false) রিটার্ন করে:

    • true → ব্যবহারকারীর কাছে পারমিশন আছে।

    • false → ব্যবহারকারীর কাছে পারমিশন নেই।

উদাহরণ:

if ($user->can('edit articles')) {
echo "আপনি আর্টিকেল এডিট করতে পারবেন।";
} else {
echo "আপনার পারমিশন নেই।";
}

Multiple permissions can be synced to a role using either of these methods:

$role->syncPermissions($permissions);
$permission->syncRoles($roles);
একটি রোলে একাধিক পারমিশন (অনুমতি) সিঙ্ক করা একটি রোলে একাধিক পারমিশন যুক্ত বা সিঙ্ক করতে আপনি এই দুইটি পদ্ধতির মধ্যে যেকোনো একটি ব্যবহার
করতে পারেন: $role->syncPermissions($permissions); এখানে $role হলো আপনার রোল অবজেক্ট। $permissions হলো সেই পারমিশনের অ্যারে বা কালেকশন যা আপনি রোলে যুক্ত করতে চান। এটি রোলে থাকা পূর্বের পারমিশনগুলো মুছে ফেলে এবং নতুনভাবে দেওয়া পারমিশনগুলো যুক্ত করে। $permission->syncRoles($roles); এখানে $permission হলো পারমিশন অবজেক্ট। $roles হলো সেই রোলের অ্যারে বা কালেকশন যেখানে আপনি এই পারমিশনটি যুক্ত করতে চান। এটি নির্দিষ্ট পারমিশনটিকে একাধিক রোলে সিঙ্ক করে। সংক্ষেপে: $role->syncPermissions() → রোলে নতুন পারমিশন সেট করা। $permission->syncRoles() → পারমিশনকে একাধিক রোলে যুক্ত করা।

A permission can be removed from a role using either of these methods:

$role->revokePermissionTo($permission);
$permission->removeRole($role);
আপনি যখন একটি রোল থেকে কোনো পারমিশন সরাতে চান, তখন এই দুইটি পদ্ধতির মধ্যে যেকোনো
একটি ব্যবহার করতে পারেন: রোল দিয়ে পারমিশন সরানো $role->revokePermissionTo($permission); এটি সেই রোল থেকে নির্দিষ্ট পারমিশনটি বাতিল করে দেবে। পারমিশন দিয়ে রোল থেকে সরানো $permission->removeRole($role); এটি পারমিশনটির সাথে যুক্ত রোল থেকে সেটি সরিয়ে দেয়। সরাসরি বলতে গেলে: একটি রোল থেকে পারমিশন সরাতে $role->revokePermissionTo()
বা $permission->removeRole() ব্যবহার করা হয়।

Prerequisites



আপনার User মডেল/অবজেক্টে role বা roles প্রপার্টি/রিলেশন থাকা যাবে না আপনার User মডেল/অবজেক্টে কখনও role বা roles নামের প্রপার্টি (বা ডাটাবেজে কলাম) থাকা যাবে না। এছাড়াও roles() নামের কোনো মেথড বা রিলেশনও থাকা চলবে না। কারণ: HasRoles ট্রেইট (যা Spatie Permission প্যাকেজ দিয়ে আসে) ইতিমধ্যেই রোল এবং পারমিশন সম্পর্কিত
প্রপার্টি, মেথড ও রিলেশন যোগ করে। যদি আপনার মডেলে এগুলো আগে থেকেই থাকে,
তাহলে HasRoles-এর ফাংশনগুলোর সাথে কনফ্লিক্ট হবে এবং
পারমিশন/রোল চেক করার সময় অপ্রত্যাশিত ফলাফল দেখাবে। সংক্ষেপে: না থাকা উচিত: role, roles প্রপার্টি বা কলাম না থাকা উচিত: roles() মেথড বা রিলেশন কারণ: এটি HasRoles ট্রেইটের কাজের সঙ্গে বিরোধ সৃষ্টি করে।

Your User model/object MUST NOT have a permission or permissions property (or field in the database by that name), nor a permissions() method on it (nor a permissions relation). Those will interfere with the properties and methods and relations added by the HasPermissions trait provided by this package (which is invoked via the HasRoles trait).

আপনার User মডেল/অবজেক্টে কোনো permission বা permissions প্রপার্টি/রিলেশন থাকা যাবে না, এবং কোনো permissions() মেথডও থাকা যাবে না।

কারণ, এগুলো থাকা HasPermissions ট্রেইট দ্বারা যোগ করা প্রপার্টি, মেথড এবং রিলেশনের সঙ্গে দ্বন্দ্ব তৈরি করতে পারে। এই ট্রেইটটি HasRoles ট্রেইট ব্যবহার করে চালু করা হয়।

সারসংক্ষেপে:

User টেবিলে permissions নামের কোনো কলাম থাকবে না।

User মডেলে permissions নামের কোনো প্রপার্টি বা মেথড থাকবে না।

HasRoles/HasPermissions প্যাকেজের মেকানিজম ঠিকভাবে কাজ করবে এমনটি নিশ্চিত করতে।

আপনি চাইলে আমি একটা ছোট উদাহরণসহ দেখাতে পারি কীভাবে User মডেল ঠিকভাবে লিখতে হবে।

INSTEAD OF DIRECT PERMISSIONS, it is better to assign permissions to Roles, and then assign Roles to Users.

See the Roles vs Permissions section of the docs for a deeper explanation.

HOWEVER, If you have reason to directly assign individual permissions to specific users (instead of to roles which are assigned to those users), you can do that as well:

এইটা সহজভাবে বললে এভাবে বুঝতে পারো:

Laravel এর Spatie Permission প্যাকেজে দুইটা জিনিস আছে – Roles এবং Permissions।

Roles (ভূমিকা):

ধরো, তুমি একটা সিস্টেম বানাচ্ছ যেখানে তিন ধরনের ব্যবহারকারী আছে – Admin, Editor, Viewer। এগুলোকে Roles বলো।

Roles-এর সঙ্গে তুমি বিভিন্ন Permissions (যেমন, create-post, edit-post, delete-post) যুক্ত করো। তারপর তুমি শুধু Role assign করলেই user সেই Role-এর সব permissions পেয়ে যায়। এটাই Best Practice, কারণ সহজে manage করা যায়।

Direct Permissions (সরাসরি অনুমতি):

তুমি চাইলে কোনো User-কে Role assign না করে সরাসরি Permission দিতে পারো।

উদাহরণ: $user->givePermissionTo('edit-post');

এটা সাধারণত তখনই দরকার যখন কিছু ইউজারকে বিশেষভাবে আলাদা permission দিতে হয়।

সংক্ষেপে:

সাধারণভাবে: Roles ➔ Users

বিশেষ ক্ষেত্রে: Permissions ➔ Users

এটা স্পষ্টভাবে দেখানোর জন্য Spatie এর ডকুমেন্টেশনও বলছে, direct permission দেয়া সম্ভব, কিন্তু Best Practice হল Role দিয়ে manage করা।


Like all permissions assigned via roles, you can check if a user has a permission by using Laravel's default can function. This will also allow you to use Super-Admin features provided by Laravel's Gate:

$user->can('edit articles');

NOTE: The following hasPermissionTohasAnyPermissionhasAllPermissions functions do not support Super-Admin functionality. Use cancanAny instead.

You can check if a user has a permission:

$user->hasPermissionTo('edit articles');

Or you may pass an integer representing the permission id

$user->hasPermissionTo('1');
$user->hasPermissionTo(Permission::find(1)->id);
$user->hasPermissionTo($somePermission->id);

You can check if a user has Any of an array of permissions:

$user->hasAnyPermission(['edit articles', 'publish articles', 'unpublish articles']);

...or if a user has All of an array of permissions:

$user->hasAllPermissions(['edit articles', 'publish articles', 'unpublish articles']);

You may also pass integers to lookup by permission id

$user->hasAnyPermission(['edit articles', 1, 5]);

ব্যবহারকারীদের সরাসরি পারমিশন দেওয়া/অপসারণ করা

কোনো ব্যবহারকারীকে পারমিশন দেওয়া:

$user->givePermissionTo('edit articles');
  • এটি edit articles পারমিশন ব্যবহারকারীকে দেয়।

একাধিক পারমিশন একসাথে দেওয়া:

$user->givePermissionTo('edit articles', 'delete articles');
  • এখানে ব্যবহারকারীকে একসাথে edit articles এবং delete articles পারমিশন দেওয়া হয়েছে।

অথবা অ্যারে ব্যবহার করে পারমিশন দেওয়া:

$user->givePermissionTo(['edit articles', 'delete articles']);
  • একই কাজ, শুধু অ্যারে আকারে দেওয়া হয়েছে।


কোনো পারমিশন বাতিল করা:

$user->revokePermissionTo('edit articles');
  • এটি ব্যবহারকারীর edit articles পারমিশন সরিয়ে দেয়।

একসাথে বাতিল ও নতুন পারমিশন যুক্ত করা:

$user->syncPermissions(['edit articles', 'delete articles']);
  • এটি ব্যবহারকারীর আগের সব সরাসরি পারমিশন মুছে দেয় এবং শুধুমাত্র এখানে দেওয়া পারমিশনগুলো

যুক্ত করে।

Post a Comment

0 Comments