中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Django RBAC權限管理設計過程詳解

發布時間:2020-09-11 05:36:29 來源:腳本之家 閱讀:707 作者:Maple_feng 欄目:開發技術

一.權限簡介

1. 問:為什么程序需要權限控制?

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

程序開發時的權限控制,對于不同用戶使用系統時候就應該有不同的功能,如:

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

所以,只要有不同角色的人員來使用系統,那么就肯定需要權限系統。

2. 問:為什么要開發權限組件?

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

偷偷告訴你:老程序員開發速度快,其中一個原因是經驗豐富,另外一個就是他自己保留了很多組件,新系統開發時,只需把組件拼湊起來基本就可以完成。

3. 問:web開發中權限指的是什么?

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

結論:一個人有多少個權限就取決于他有多少個URL的訪問權限。

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

問答環節中已得出權限就是URL的結論,那么就可以開始設計表結構了。

  • 一個用戶可以有多個權限。
  • 一個權限可以分配給多個用戶。

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

Django RBAC權限管理設計過程詳解

現在,此時此刻是不是覺得自己設計出的表結構棒棒噠!!!

But,無論是是否承認,你還是too young too native,因為老漢腚眼一看就有問題....

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

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

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

  • 一個人可以有多個角色。
  • 一個角色可以有多個人。
  • 一個角色可以有多個權限。
  • 一個權限可以分配給多個角色。

表結構設計:

Django RBAC權限管理設計過程詳解

這次調整之后,由原來的【基于用戶的權限控制】轉換成【基于角色的權限控制】,以后再進行分配權限時只需要給指定角色分配一次權限,給眾多用戶再次分配指定角色即可。

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

永州市| 侯马市| 朝阳县| 青阳县| 磐安县| 托克逊县| 苍溪县| 葵青区| 白玉县| 郎溪县| 靖边县| 广饶县| 报价| 郓城县| 手机| 郴州市| 建水县| 尚义县| 如皋市| 宣汉县| 白水县| 会理县| 沅陵县| 旬邑县| 泾阳县| 翁源县| 衡阳县| 涟源市| 岱山县| 吉林市| 华坪县| 鹰潭市| 上高县| 富宁县| 鄢陵县| 隆尧县| 贺兰县| 烟台市| 普洱| 亳州市| 余庆县|