ساخت سیستم مدیریت نقش‌ها با پایتون و فریم‌ورک‌های وب

ساخت سیستم مدیریت نقش‌ها با پایتون و فریم‌ورک‌های وب

سیستم مدیریت نقش‌ها (Role-Based Access Control – RBAC) یکی از مهم‌ترین جنبه‌های امنیت و مدیریت دسترسی در هر برنامه وب است. این سیستم به شما امکان می‌دهد تا دسترسی کاربران به بخش‌های مختلف برنامه را بر اساس نقش‌های تعریف شده کنترل کنید. در این مقاله، به بررسی نحوه پیاده‌سازی یک سیستم مدیریت نقش‌ها با استفاده از پایتون و فریم‌ورک‌های وب محبوب مانند Flask یا Django خواهیم پرداخت. این آموزش در دسته ‘توسعه وب با پایتون’ قرار می‌گیرد و برای توسعه‌دهندگانی که قصد دارند امنیت برنامه‌های خود را افزایش دهند، مفید خواهد بود.

مفاهیم کلیدی سیستم مدیریت نقش‌ها

قبل از شروع پیاده‌سازی، لازم است با مفاهیم کلیدی RBAC آشنا شویم:

  • نقش (Role): مجموعه‌ای از مجوزها که به کاربران اختصاص داده می‌شود. به عنوان مثال، نقش ‘مدیر’، ‘نویسنده’، ‘ویرایشگر’ و ‘بیننده’.
  • مجوز (Permission): دسترسی به یک منبع یا انجام یک عملیات خاص. به عنوان مثال، ‘ویرایش پست‌ها’، ‘حذف کاربران’، ‘مشاهده گزارش‌ها’.
  • کاربر (User): فردی که از برنامه استفاده می‌کند و به یک یا چند نقش اختصاص داده می‌شود.
  • ارتباط نقش-مجوز (Role-Permission Relationship): تعیین می‌کند که هر نقش چه مجوزهایی دارد.
  • ارتباط کاربر-نقش (User-Role Relationship): تعیین می‌کند که هر کاربر چه نقش‌هایی دارد.

طراحی پایگاه داده

برای پیاده‌سازی RBAC، نیاز به یک پایگاه داده داریم که اطلاعات مربوط به کاربران، نقش‌ها، مجوزها و ارتباطات بین آن‌ها را ذخیره کند. یک طراحی ساده می‌تواند شامل جداول زیر باشد:

  • users: شامل اطلاعات کاربران (id, username, password, email و غیره).
  • roles: شامل اطلاعات نقش‌ها (id, name).
  • permissions: شامل اطلاعات مجوزها (id, name).
  • role_permissions: جدول رابطه‌ای که ارتباط بین نقش‌ها و مجوزها را نشان می‌دهد (role_id, permission_id).
  • user_roles: جدول رابطه‌ای که ارتباط بین کاربران و نقش‌ها را نشان می‌دهد (user_id, role_id).

پیاده‌سازی با Flask

Flask یک فریم‌ورک وب سبک و انعطاف‌پذیر پایتون است. در اینجا یک مثال ساده از نحوه پیاده‌سازی RBAC با Flask آورده شده است:

1. نصب Flask و SQLAlchemy:

pip install Flask SQLAlchemy

2. تعریف مدل‌های پایگاه داده:

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)
    password = db.Column(db.String(120), nullable=False)
    roles = db.relationship('Role', secondary='user_roles')

class Role(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(80), unique=True, nullable=False)
    permissions = db.relationship('Permission', secondary='role_permissions')

class Permission(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(80), unique=True, nullable=False)

class UserRoles(db.Model):
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'), primary_key=True)
    role_id = db.Column(db.Integer, db.ForeignKey('role.id'), primary_key=True)

class RolePermissions(db.Model):
    role_id = db.Column(db.Integer, db.ForeignKey('role.id'), primary_key=True)
    permission_id = db.Column(db.Integer, db.ForeignKey('permission.id'), primary_key=True)

3. ایجاد یک دکوراتور برای بررسی مجوز:

from functools import wraps
from flask import g

def permission_required(permission_name):
    def decorator(f):
        @wraps(f)
        def decorated_function(*args, **kwargs):
            if not has_permission(permission_name):
                return "دسترسی غیرمجاز", 403
            return f(*args, **kwargs)
        return decorated_function
    return decorator

def has_permission(permission_name):
    if g.user is None:
        return False
    for role in g.user.roles:
        for permission in role.permissions:
            if permission.name == permission_name:
                return True
    return False

4. استفاده از دکوراتور در یک مسیر:

from flask import Flask, g, request

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///rbac.db'
db.init_app(app)

@app.before_request
def before_request():
    # احراز هویت کاربر (مثال ساده)
    g.user = User.query.filter_by(username='testuser').first()

@app.route('/admin')
@permission_required('ویرایش پست‌ها')
def admin():
    return "صفحه مدیریت"

@app.route('/')
def index():
    return "صفحه اصلی"

if __name__ == '__main__':
    with app.app_context():
        db.create_all()
    app.run(debug=True)

پیاده‌سازی با Django

Django یک فریم‌ورک وب قدرتمند و کامل پایتون است. Django دارای سیستم مدیریت کاربران داخلی است که می‌توان از آن برای پیاده‌سازی RBAC استفاده کرد.

1. ایجاد یک مدل Role:

from django.db import models
from django.contrib.auth.models import User

class Role(models.Model):
    name = models.CharField(max_length=100, unique=True)
    permissions = models.ManyToManyField('Permission', blank=True)

    def __str__(self):
        return self.name

class Permission(models.Model):
    name = models.CharField(max_length=100, unique=True)

    def __str__(self):
        return self.name

2. افزودن فیلد Role به مدل User:

from django.contrib.auth.models import AbstractUser
from django.db import models

class CustomUser(AbstractUser):
    roles = models.ManyToManyField(Role, blank=True)

3. ایجاد یک دکوراتور برای بررسی مجوز:

from django.http import HttpResponseForbidden
from django.shortcuts import redirect

def permission_required(permission_name):
    def decorator(view_func):
        def _wrapped_view(request, *args, **kwargs):
            if request.user.is_authenticated:
                for role in request.user.roles.all():
                    if permission_name in [p.name for p in role.permissions.all()]:
                        return view_func(request, *args, **kwargs)
            return HttpResponseForbidden("دسترسی غیرمجاز")
        return _wrapped_view
    return decorator

4. استفاده از دکوراتور در یک View:

from django.shortcuts import render
from .decorators import permission_required

@permission_required('ویرایش پست‌ها')
def admin_view(request):
    return render(request, 'admin.html')

نکات مهم در پیاده‌سازی RBAC

  • امنیت: اطمینان حاصل کنید که رمزهای عبور کاربران به طور ایمن ذخیره می‌شوند و از حملات احتمالی جلوگیری می‌شود.
  • مقیاس‌پذیری: سیستم RBAC باید بتواند با افزایش تعداد کاربران، نقش‌ها و مجوزها به خوبی مقیاس‌پذیر باشد.
  • انعطاف‌پذیری: سیستم RBAC باید به راحتی قابل تنظیم و گسترش باشد تا بتوانید نیازهای جدید را برآورده کنید.
  • مدیریت: یک رابط کاربری مناسب برای مدیریت نقش‌ها، مجوزها و ارتباطات بین آن‌ها فراهم کنید.
  • آزمایش: سیستم RBAC را به طور کامل آزمایش کنید تا از عملکرد صحیح آن اطمینان حاصل کنید.

نتیجه‌گیری

سیستم مدیریت نقش‌ها یک جزء حیاتی در امنیت و مدیریت دسترسی برنامه‌های وب است. با استفاده از پایتون و فریم‌ورک‌های وب مانند Flask یا Django، می‌توانید یک سیستم RBAC قدرتمند و انعطاف‌پذیر پیاده‌سازی کنید. این مقاله یک راهنمای کلی برای شروع کار با RBAC در پایتون ارائه داد. با توجه به نیازهای خاص برنامه خود، می‌توانید این سیستم را سفارشی‌سازی و بهبود بخشید.

بدون دیدگاه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *