Role-Based Access Control (RBAC) হল একটি নিরাপত্তা কৌশল যা বিভিন্ন রোলের ভিত্তিতে ব্যবহারকারীদের অ্যাপ্লিকেশন বা সিস্টেমের বিভিন্ন অংশে প্রবেশাধিকার নিয়ন্ত্রণ করে। RBAC ব্যবহার করে, অ্যাপ্লিকেশনগুলোর নিরাপত্তা বৃদ্ধি পায় এবং বিভিন্ন ধরনের ইউজার বা রোলের জন্য বিশেষাধিকার নির্ধারণ করা যায়। MVC ফ্রেমওয়ার্কে RBAC ইমপ্লিমেন্ট করার মাধ্যমে ইউজারদের একাধিক রোল ভিত্তিক অনুমতি দেওয়া সম্ভব হয়, যেমন অ্যাডমিন, ইউজার, মডারেটর ইত্যাদি।
এখানে RBAC ইমপ্লিমেন্ট করার জন্য একটি সাধারণ পদক্ষেপ আলোচনা করা হবে, যা Laravel ফ্রেমওয়ার্কের মধ্যে প্রয়োগ করা যাবে। তবে এই পদ্ধতিগুলি অন্য এমভিসি ফ্রেমওয়ার্কেও প্রয়োগ করা যেতে পারে।
RBAC ইমপ্লিমেন্ট করার জন্য প্রয়োজনীয় পদক্ষেপ
১. ডাটাবেস মডেল তৈরি করা
প্রথমে, আপনাকে roles এবং permissions সম্পর্কিত দুটি টেবিল তৈরি করতে হবে। এতে আপনি রোল এবং তাদের অনুমতির জন্য সঠিক তথ্য সংরক্ষণ করবেন।
মাইগ্রেশন ফাইল তৈরি:
php artisan make:migration create_roles_table
php artisan make:migration create_permissions_table
php artisan make:migration create_role_user_table
php artisan make:migration create_permission_role_table
রোল এবং পারমিশন টেবিল:
// create_roles_table.php মাইগ্রেশন
public function up()
{
Schema::create('roles', function (Blueprint $table) {
$table->id();
$table->string('name')->unique();
$table->timestamps();
});
}
// create_permissions_table.php মাইগ্রেশন
public function up()
{
Schema::create('permissions', function (Blueprint $table) {
$table->id();
$table->string('name')->unique();
$table->timestamps();
});
}
// create_role_user_table.php মাইগ্রেশন
public function up()
{
Schema::create('role_user', function (Blueprint $table) {
$table->id();
$table->foreignId('role_id')->constrained()->onDelete('cascade');
$table->foreignId('user_id')->constrained()->onDelete('cascade');
$table->timestamps();
});
}
// create_permission_role_table.php মাইগ্রেশন
public function up()
{
Schema::create('permission_role', function (Blueprint $table) {
$table->id();
$table->foreignId('permission_id')->constrained()->onDelete('cascade');
$table->foreignId('role_id')->constrained()->onDelete('cascade');
$table->timestamps();
});
}
২. মডেল তৈরি করা
এখন আপনাকে রোল, পারমিশন এবং ইউজার মডেল তৈরি করতে হবে।
// Role.php মডেল
class Role extends Model
{
public function permissions()
{
return $this->belongsToMany(Permission::class);
}
public function users()
{
return $this->belongsToMany(User::class);
}
}
// Permission.php মডেল
class Permission extends Model
{
public function roles()
{
return $this->belongsToMany(Role::class);
}
}
// User.php মডেল
class User extends Authenticatable
{
public function roles()
{
return $this->belongsToMany(Role::class);
}
public function hasRole($role)
{
return $this->roles->contains('name', $role);
}
public function hasPermission($permission)
{
foreach ($this->roles as $role) {
if ($role->permissions->contains('name', $permission)) {
return true;
}
}
return false;
}
}
৩. রোল এবং পারমিশন অ্যাসাইন করা
এখন, আপনি রোল এবং পারমিশন ব্যবহারকারীদের অ্যাসাইন করতে পারবেন। উদাহরণস্বরূপ, ইউজারকে একটি রোল অ্যাসাইন করা এবং সেই রোলের জন্য পারমিশন দেওয়া হবে।
// Role এবং Permission তৈরি করা
$adminRole = Role::create(['name' => 'admin']);
$userRole = Role::create(['name' => 'user']);
$createPostPermission = Permission::create(['name' => 'create post']);
$deletePostPermission = Permission::create(['name' => 'delete post']);
// পারমিশন রোলের সাথে অ্যাসাইন করা
$adminRole->permissions()->attach([$createPostPermission->id, $deletePostPermission->id]);
// ইউজারকে রোল অ্যাসাইন করা
$user = User::find(1);
$user->roles()->attach($adminRole);
৪. রোল এবং পারমিশনের ভিত্তিতে এক্সেস নিয়ন্ত্রণ করা
এখন, আপনি কন্ট্রোলার, ভিউ বা অন্যান্য অংশে ইউজারের রোল এবং পারমিশন চেক করে তাদের এক্সেস নিয়ন্ত্রণ করতে পারবেন।
কন্ট্রোলার এক্সেস চেক:
class PostController extends Controller
{
public function create()
{
if (auth()->user()->hasPermission('create post')) {
// ইউজার পারমিশন আছে, পোস্ট তৈরি পেজ দেখানো হবে
return view('posts.create');
}
return redirect()->back()->with('error', 'You do not have permission to create posts.');
}
public function delete($id)
{
if (auth()->user()->hasPermission('delete post')) {
// ইউজার পারমিশন আছে, পোস্ট ডিলিট করা হবে
Post::findOrFail($id)->delete();
return redirect()->route('posts.index')->with('success', 'Post deleted successfully');
}
return redirect()->back()->with('error', 'You do not have permission to delete posts.');
}
}
ভিউতে এক্সেস নিয়ন্ত্রণ:
@if(auth()->user()->hasRole('admin'))
<!-- Only admins can see this section -->
<button>Edit Post</button>
@endif
৫. মিডলওয়্যার দিয়ে এক্সেস নিয়ন্ত্রণ
এটি আরও কার্যকরী এবং নিরাপদ করার জন্য আপনি মিডলওয়্যার ব্যবহার করতে পারেন, যাতে রোল এবং পারমিশনের ভিত্তিতে রিকোয়েস্ট হ্যান্ডল করা যায়।
// RoleMiddleware.php
public function handle($request, Closure $next, $role)
{
if (!auth()->user()->hasRole($role)) {
return redirect()->route('home')->with('error', 'You do not have access to this page.');
}
return $next($request);
}
এখন, আপনি রাউটগুলোতে মিডলওয়্যার অ্যাপ্লাই করতে পারেন:
Route::group(['middleware' => ['role:admin']], function () {
Route::get('/admin', 'AdminController@index');
});
সার্বিকভাবে
RBAC বা Role-Based Access Control এমভিসি ফ্রেমওয়ার্কে এক্সেস নিয়ন্ত্রণের একটি শক্তিশালী কৌশল। এটি ইউজারের রোল এবং পারমিশনের ভিত্তিতে নির্দিষ্ট কার্যকলাপের অনুমতি দেয়, যেমন অ্যাডমিন, মডারেটর, বা সাধারণ ইউজার। RBAC ইমপ্লিমেন্ট করার মাধ্যমে অ্যাপ্লিকেশনটির নিরাপত্তা বৃদ্ধি পায় এবং আপনি আরও সহজে বিভিন্ন স্তরের ইউজার এক্সেস পরিচালনা করতে পারেন।
Read more