欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Django RBAC權(quán)限管理設(shè)計(jì)過程詳解

 更新時(shí)間:2019年08月06日 14:16:51   作者:Maple_feng  
這篇文章主要介紹了Django RBAC權(quán)限管理設(shè)計(jì)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

一.權(quán)限簡介

1. 問:為什么程序需要權(quán)限控制?

答:生活中的權(quán)限限制,① 看災(zāi)難片電影《2012》中富人和權(quán)貴有權(quán)登上諾亞方舟,窮苦老百姓只有等著災(zāi)難的來臨;② 屌絲們,有沒有想過為什么那些長得漂亮身材好的姑娘在你身邊不存在呢?因?yàn)橛绣X人和漂亮姑娘都是珍貴稀有的,稀有的人在一起玩耍和解鎖各種姿勢。而你,無權(quán)擁有他們,只能自己玩自己了。

程序開發(fā)時(shí)的權(quán)限控制,對于不同用戶使用系統(tǒng)時(shí)候就應(yīng)該有不同的功能,如:

  • 普通員工
  • 部門主管
  • 總監(jiān)
  • 總裁

所以,只要有不同角色的人員來使用系統(tǒng),那么就肯定需要權(quán)限系統(tǒng)。

2. 問:為什么要開發(fā)權(quán)限組件?

答:假設(shè)你今年25歲,從今天開始寫代碼到80歲,每年寫5個(gè)項(xiàng)目,那么你的一生就會(huì)寫275個(gè)項(xiàng)目,保守估計(jì)其中應(yīng)該有150+個(gè)都需要用到權(quán)限控制,為了以后不再重復(fù)的寫代碼,所以就開發(fā)一個(gè)權(quán)限組件以便之后55年的歲月中使用。 親,不要太較真哦,你覺得程序員能到80歲么,哈哈哈哈哈哈哈

偷偷告訴你:老程序員開發(fā)速度快,其中一個(gè)原因是經(jīng)驗(yàn)豐富,另外一個(gè)就是他自己保留了很多組件,新系統(tǒng)開發(fā)時(shí),只需把組件拼湊起來基本就可以完成。

3. 問:web開發(fā)中權(quán)限指的是什么?

答:web程序是通過 url 的切換來查看不同的頁面(功能),所以權(quán)限指的其實(shí)就是URL,對url控制就是對權(quán)限的控制。

結(jié)論:一個(gè)人有多少個(gè)權(quán)限就取決于他有多少個(gè)URL的訪問權(quán)限。

二.權(quán)限表結(jié)構(gòu)設(shè)計(jì):第一版

問答環(huán)節(jié)中已得出權(quán)限就是URL的結(jié)論,那么就可以開始設(shè)計(jì)表結(jié)構(gòu)了。

  • 一個(gè)用戶可以有多個(gè)權(quán)限。
  • 一個(gè)權(quán)限可以分配給多個(gè)用戶。

你設(shè)計(jì)的表結(jié)構(gòu)大概會(huì)是這個(gè)樣子:

現(xiàn)在,此時(shí)此刻是不是覺得自己設(shè)計(jì)出的表結(jié)構(gòu)棒棒噠?。?!

But,無論是是否承認(rèn),你還是too young too native,因?yàn)槔蠞h腚眼一看就有問題....

問題:假設(shè) “maple”和“ffm” 這倆貨都是老板,老板的權(quán)限一定是非常多。那么試想,如果給這倆貨分配權(quán)限時(shí)需要在【用戶權(quán)限關(guān)系表中】添加好多條數(shù)據(jù)。假設(shè)再次需要對老板的權(quán)限進(jìn)行修改時(shí),又需要在【用戶權(quán)限關(guān)系表】中找到這倆人所有的數(shù)據(jù)進(jìn)行更新,太他媽煩了吧?。?! 類似的,如果給其他相同角色的人來分配權(quán)限時(shí),必然會(huì)非常繁瑣。

三.權(quán)限表結(jié)構(gòu)設(shè)計(jì):第二版

聰明機(jī)智的一定在上述的表述中看出了寫門道,如果對用戶進(jìn)行角色的劃分,然后對角色進(jìn)行權(quán)限的分配,這不就迎刃而解了么。

  • 一個(gè)人可以有多個(gè)角色。
  • 一個(gè)角色可以有多個(gè)人。
  • 一個(gè)角色可以有多個(gè)權(quán)限。
  • 一個(gè)權(quán)限可以分配給多個(gè)角色。

表結(jié)構(gòu)設(shè)計(jì):

這次調(diào)整之后,由原來的【基于用戶的權(quán)限控制】轉(zhuǎn)換成【基于角色的權(quán)限控制】,以后再進(jìn)行分配權(quán)限時(shí)只需要給指定角色分配一次權(quán)限,給眾多用戶再次分配指定角色即可。

from django.db import models
class Permission(models.Model):
  """
  權(quán)限表
  """
  title = models.CharField(verbose_name='標(biāo)題', 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='擁有的所有權(quán)限', 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

注意:現(xiàn)在的設(shè)計(jì)還不是最終版,但之后的設(shè)計(jì)都是在此版本基礎(chǔ)上擴(kuò)增的,為了讓大家能夠更好的理解,我們暫且再此基礎(chǔ)上繼續(xù)開發(fā),直到遇到無法滿足的情況,再進(jìn)行整改。

四.客戶管理之動(dòng)態(tài)“一級”菜單

from django.db import models
class Permission(models.Model):
  """
  權(quán)限表
  """
  title = models.CharField(verbose_name='標(biāo)題', max_length=32)
  url = models.CharField(verbose_name='含正則的URL', max_length=128)
  icon = models.CharField(verbose_name='圖標(biāo)', max_length=32, null=True, blank=True, help_text='菜單才設(shè)置圖標(biāo)')
  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='擁有的所有權(quán)限', 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

五.客戶管理之動(dòng)態(tài)“二級”菜單

from django.db import models
class Menu(models.Model):
  """
  菜單
  """
  title = models.CharField(verbose_name='菜單', max_length=32)
  icon = models.CharField(verbose_name='圖標(biāo)', max_length=32)
  def __str__(self):
    return self.title
class Permission(models.Model):
  """
  權(quán)限表
  """
  title = models.CharField(verbose_name='標(biāo)題', 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='擁有的所有權(quán)限', 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

六.客戶管理之默認(rèn)展開非菜單URL

from django.db import models
class Menu(models.Model):
  """
  菜單
  """
  title = models.CharField(verbose_name='菜單', max_length=32)
  icon = models.CharField(verbose_name='圖標(biāo)', max_length=32)
  def __str__(self):
    return self.title
class Permission(models.Model):
  """
  權(quán)限表
  """
  title = models.CharField(verbose_name='標(biāo)題', max_length=32)
  url = models.CharField(verbose_name='含正則的URL', max_length=128)

  pid = models.ForeignKey(verbose_name='默認(rèn)選中權(quán)限', to='Permission', related_name='ps', null=True, blank=True,
              help_text="對于無法作為菜單的URL,可以為其選擇一個(gè)可以作為菜單的權(quán)限,那么訪問時(shí),則默認(rèn)選中此權(quán)限",
              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='擁有的所有權(quán)限', 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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • python解析html提取數(shù)據(jù),并生成word文檔實(shí)例解析

    python解析html提取數(shù)據(jù),并生成word文檔實(shí)例解析

    這篇文章主要介紹了python解析html提取數(shù)據(jù),并生成word文檔實(shí)例解析,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • Python第三方庫的安裝方法總結(jié)

    Python第三方庫的安裝方法總結(jié)

    庫library是一個(gè)泛稱,一般值作為文件形式存在的模塊以及以文件夾形式存在的包的合成,這里作了Python第三方庫的安裝方法總結(jié),包括源碼安裝、包管理器安裝以及虛擬環(huán)境相關(guān)安裝三種方式的講解
    2016-06-06
  • 詳解Python爬蟲爬取博客園問題列表所有的問題

    詳解Python爬蟲爬取博客園問題列表所有的問題

    這篇文章主要介紹了詳解Python爬蟲爬取博客園問題列表所有的問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • Python tkinter進(jìn)度條控件(Progressbar)的使用

    Python tkinter進(jìn)度條控件(Progressbar)的使用

    這篇文章主要介紹了Python tkinter進(jìn)度條控件(Progressbar)的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • pygame學(xué)習(xí)筆記(4):聲音控制

    pygame學(xué)習(xí)筆記(4):聲音控制

    這篇文章主要介紹了pygame學(xué)習(xí)筆記(4):聲音控制,本文講解了pygame.mixer啟動(dòng)與初始化、播放聲音片段wav文件、播放mp3、wma、ogg音樂文件、控制音量、制作mp3播放器中遇到的問題等內(nèi)容,需要的朋友可以參考下
    2015-04-04
  • Python實(shí)現(xiàn)DDos攻擊實(shí)例詳解

    Python實(shí)現(xiàn)DDos攻擊實(shí)例詳解

    這篇文章主要給大家介紹了關(guān)于Python實(shí)現(xiàn)DDos攻擊的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-02-02
  • Python操作PDF實(shí)現(xiàn)制作數(shù)據(jù)報(bào)告

    Python操作PDF實(shí)現(xiàn)制作數(shù)據(jù)報(bào)告

    Python操作PDF的庫有很多,比如PyPDF2、pdfplumber、PyMuPDF等等。本文將利用FPDF模塊操作PDF實(shí)現(xiàn)制作數(shù)據(jù)報(bào)告,感興趣的小伙伴可以嘗試一下
    2022-12-12
  • python運(yùn)行shell命令subprocess的實(shí)現(xiàn)

    python運(yùn)行shell命令subprocess的實(shí)現(xiàn)

    本文主要介紹了python運(yùn)行shell命令subprocess的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • Python數(shù)據(jù)庫安裝及MySQL?Connector應(yīng)用教程

    Python數(shù)據(jù)庫安裝及MySQL?Connector應(yīng)用教程

    這篇文章主要為大家介紹了Python數(shù)據(jù)庫安裝及MySQL Connector應(yīng)用教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • 從零學(xué)python系列之淺談pickle模塊封裝和拆封數(shù)據(jù)對象的方法

    從零學(xué)python系列之淺談pickle模塊封裝和拆封數(shù)據(jù)對象的方法

    這個(gè)系列也發(fā)了幾篇文章了,都是個(gè)人的一些學(xué)習(xí)心得的記錄,今天在學(xué)習(xí)文件數(shù)據(jù)處理的時(shí)候了解到有pickle模塊,查找官方文檔學(xué)習(xí)了一些需要用到的pickle內(nèi)容。
    2014-05-05

最新評論