RBAC權限管理設計

一.權限簡介

1. 問:爲何程序須要權限控制?程序員

答:生活中的權限限制,① 看災難片電影《2012》中富人和權貴有權登上諾亞方舟,窮苦老百姓只有等着災難的來臨;② 屌絲們,有沒有想過爲何那些長得漂亮身材好的姑娘在你身邊不存在呢?由於有錢人和漂亮姑娘都是珍貴稀有的,稀有的人在一塊兒玩耍和解鎖各類姿式。而你,無權擁有他們,只能本身玩本身了。
程序開發時的權限控制,對於不一樣用戶使用系統時候就應該有不一樣的功能,如:web

  • 普通員工
  • 部門主管
  • 總監
  • 總裁

因此,只要有不一樣角色的人員來使用系統,那麼就確定須要權限系統。django

2. 問:爲何要開發權限組件?url

   答:假設你今年25歲,從今天開始寫代碼到80歲,每一年寫5個項目,那麼你的一輩子就會寫275個項目,保守估計其中應該有150+個都須要用到權限控制,爲了之後再也不重複的寫代碼,因此就開發一個權限組件以便以後55年的歲月中使用。 親,不要太較真哦,你以爲程序員能到80歲麼,哈哈哈哈哈哈哈 
偷偷告訴你:老程序員開發速度快,其中一個緣由是經驗豐富,另一個就是他本身保留了不少組件,新系統開發時,只需把組件拼湊起來基本就能夠完成。spa

3. 問:web開發中權限指的是什麼?設計

   答:web程序是經過 url 的切換來查看不一樣的頁面(功能),因此權限指的其實就是URL,對url控制就是對權限的控制。code

結論:一我的有多少個權限就取決於他有多少個URL的訪問權限。blog

 

二.權限表結構設計:初版

問答環節中已得出權限就是URL的結論,那麼就能夠開始設計表結構了。開發

  • 一個用戶能夠有多個權限。
  • 一個權限能夠分配給多個用戶。

你設計的表結構大概會是這個樣子:權限控制

如今,此時此刻是否是以爲本身設計出的表結構棒棒噠!!!

But,不管是是否認可,你仍是too young too native,由於老漢腚眼一看就有問題....

問題:假設 「maple」和「ffm」 這倆貨都是老闆,老闆的權限必定是很是多。那麼試想,若是給這倆貨分配權限時須要在【用戶權限關係表中】添加好多條數據。假設再次須要對老闆的權限進行修改時,又須要在【用戶權限關係表】中找到這倆人全部的數據進行更新,太他媽煩了吧!!! 相似的,若是給其餘相同角色的人來分配權限時,必然會很是繁瑣。

三.權限表結構設計:第二版

聰明機智的必定在上述的表述中看出了寫門道,若是對用戶進行角色的劃分,而後對角色進行權限的分配,這不就迎刃而解了麼。

  • 一我的能夠有多個角色。
  • 一個角色能夠有多我的。
  • 一個角色能夠有多個權限。
  • 一個權限能夠分配給多個角色。

表結構設計:

 此次調整以後,由原來的【基於用戶的權限控制】轉換成【基於角色的權限控制】,之後再進行分配權限時只須要給指定角色分配一次權限,給衆多用戶再次分配指定角色便可。

from django.db import models


class Permission(models.Model):
    """
    權限表
    """
    title = models.CharField(verbose_name='標題', max_length=32)
    url = models.CharField(verbose_name='含正則的URL', max_length=128)

    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):
    """
    用戶表
    """
    name = 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)

    def __str__(self):
        return self.name

注意:如今的設計還不是最終版,但以後的設計都是在此版本基礎上擴增的,爲了讓你們可以更好的理解,咱們暫且再此基礎上繼續開發,直到遇到沒法知足的狀況,再進行整改。

四.客戶管理之動態「一級」菜單

from django.db import models


class Permission(models.Model):
    """
    權限表
    """
    title = models.CharField(verbose_name='標題', max_length=32)
    url = models.CharField(verbose_name='含正則的URL', max_length=128)

    icon = models.CharField(verbose_name='圖標', max_length=32, null=True, blank=True, help_text='菜單才設置圖標')
    is_menu = models.BooleanField(verbose_name='是不是菜單', default=False)

    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):
    """
    用戶表
    """
    name = 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)

    def __str__(self):
        return self.name

 

五.客戶管理之動態「二級」菜單

from django.db import models


class Menu(models.Model):
    """
    菜單
    """
    title = models.CharField(verbose_name='菜單', max_length=32)
    icon = models.CharField(verbose_name='圖標', max_length=32)

    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)

    menu = models.ForeignKey(verbose_name='菜單', to='Menu', null=True, blank=True, help_text='null表示非菜單')

    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):
    """
    用戶表
    """
    name = 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)

    def __str__(self):
        return self.name

 

六.客戶管理之默認展開非菜單URL

from django.db import models


class Menu(models.Model):
    """
    菜單
    """
    title = models.CharField(verbose_name='菜單', max_length=32)
    icon = models.CharField(verbose_name='圖標', max_length=32)

    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)

    pid = models.ForeignKey(verbose_name='默認選中權限', to='Permission', related_name='ps', null=True, blank=True,
                            help_text="對於沒法做爲菜單的URL,能夠爲其選擇一個能夠做爲菜單的權限,那麼訪問時,則默認選中此權限",
                            limit_choices_to={'menu__isnull': False})
    
    menu = models.ForeignKey(verbose_name='菜單', to='Menu', null=True, blank=True, help_text='null表示非菜單')

    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):
    """
    用戶表
    """
    name = 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)

    def __str__(self):
        return self.name
相關文章
相關標籤/搜索