rbac組件之數據庫設計(一)

rbac是基於角色的權限設計,一共包含六張表,具體的表設計以下:django

from django.db import models

class Menu(models.Model):
    """
    菜單表
    """
    title = models.CharField(verbose_name='菜單名稱',max_length=32,unique=True)
    icon = models.CharField(max_length=128, blank=True, null=True)

    def __str__(self):
        return self.title

class Permission(models.Model):
    """
    權限表
    """
    title = models.CharField(verbose_name='權限標題', max_length=32)
    url = models.CharField(verbose_name='含正則的URL', max_length=128)
    name=models.CharField(verbose_name='url別名',max_length=64,unique=True) #控制權限到按鈕
    parent=models.ForeignKey(verbose_name='父權限',to='self',null=True,blank=True,on_delete=models.CASCADE,limit_choices_to={'parent__isnull':True})#構建非菜單權限關係,菜單默認展開
    menu=models.ForeignKey(verbose_name='菜單',to='Menu',null=True,blank=True,on_delete=models.CASCADE)

    def __str__(self):
        return self.title


class Role(models.Model):
    """
    角色
    """
    title = models.CharField(verbose_name='角色名稱', max_length=32)
    permissions = models.ManyToManyField(verbose_name='擁有的全部權限', to='Permission', blank=True)


    def __str__(self):
        return self.title


class UserInfo(models.Model):
    """
    用戶表
    """
    username = models.CharField(verbose_name='用戶名', max_length=32)
    password = models.CharField(verbose_name='密碼', max_length=64)
    email = models.CharField(verbose_name='郵箱', max_length=32)
    roles = models.ManyToManyField(verbose_name='擁有的全部角色', to=Role, blank=True)

    class Meta:
        abstract=True #爲了crm的用戶表進行繼承

    def __str__(self):
        return self.username

其中用戶表和角色表是多對多的關係、角色表和權限表是多對多的關係。另外權限表關聯菜單,這樣某一個權限url掛載某一個菜單下,而且權限表關聯自身,這樣好比增長、刪除、修改的權限url又能夠掛在某一個權限url下面。url

相關文章
相關標籤/搜索