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
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