有一种场景, 要求为用户赋予一个角色, 基于角色(比如后管理员,总编, 编辑), 用户拥有相应的权限(比如管理员拥有所有权限, 总编可以增删改查, 编辑只能增改, 有些页面的按钮也只有某些角色才能查看)

ENV: Python3.6 + django1.11

应用场景

有一种场景, 要求为用户赋予一个角色, 基于角色(比如后管理员,总编, 编辑), 用户拥有相应的权限(比如管理员拥有所有权限, 总编可以增删改查, 编辑只能增改, 有些页面的按钮也只有某些角色才能查看), 角色可以任意添加, 每个角色的权限也可以任意设置

django 的权限系统

django 默认的权限是基于Model的add, change, delete来做权限判断的, 这种设计方式有一个明显的缺陷, 比如怎么控制对Model的某个字段的修改的权限的控制呢

设计权限

大多数的系统, 都会给用户赋予某个角色, 假如能针对用户的角色, 做权限控制,这个权限控制并不局限于对Model的修改, 可以是任意位置的权限控制, 只要有一个权限名, 即可根据用户角色名下是否拥有权限名判断是否拥有权限

User, Role => UserRole => RolePermissions

User 是用户对象

Role: 角色表

UserRole 是用户角色关系对象

RolePermissions 是角色权限关系对象

因此, 需要创建三个ModelUser,RoleUserRoleRolePermission

User 可以使用django 默认的User 对象

其他Model 如下

class Role(models.Model): """角色表""" # e.g add_user role_code = models.CharField('role code', max_length=64, unique=True, help_text = '用户角色标识') # e.g 新增用户 role_name = models.CharField('role name', max_length=64, help_text = '用户角色名') class UserRole(models.Model): """用户角色关系表""" user_id = models.IntegerField('user id', blank=False, help_text='用户id', unique=True) role_codes = models.CharField('role codes', blank=True, default=None, max_length=256, help_text='用户的角色codes') class RolePermission(models.Model): """角色权限关系表""" role_code = models.CharField('role code', max_length=64, blank=False, help_text = '用户角色标识') pm_code = models.CharField('permission code', blank=False, max_length=64, help_text='权限code') class Meta: unique_together = ('role_code', 'pms_code') 

其中 Role 和 RolePermission 用于管理角色和对应的权限的关系

UserRole 用于管理用户和角色的映射关系

权限管理

用户角色拥有哪些权限是在代码里定义好的, 比如:

PMS_MAP = (('PM_ADD_USER', '新增用户'), ('PM_SET_MAIL', '编辑邮箱'), ... ) 

PM_ADD_USER 是权限code码, 新增用户 是权限名, 在这里, 权限名由我们定义, 后面在需要使用的地方做has_perm(<pm_coede>) 判断时, 用的就是这是这个code

角色管理

在定义好权限后, 我们就可以做角色管理了,

在这里, 我们可以创建任意的角色, 为其分配任意的权限, 当然, 最好创建有意义的角色

角色表单定义(forms.py)

role_regex_validator = RegexValidator(r"[a-zA-Z0-9]", "角色标记只能包含字母,数字, 下划线") class RoleForm(forms.Form): role_row_code = forms.IntegerField(required=False, widget=forms.HiddenInput()) role_code = forms.CharField(label='角色标记', min_length=3, max_length=64, validators=[role_regex_validator]) role_name = forms.CharField(label='角色名', min_length=3, max_length=64) OPTIONS = PMS_MAP pms = forms.MultipleChoiceField(label='权限列表', widget=forms.SelectMultiple(choices=OPTIONS) 

角色编辑views.py

def role_edit(request):"""角色编辑""" if request.method == 'POST': role_row_id = request.POST.get('role_row_id', 0) role_code = request.POST.get('role_code', '') role_name = request.POST.get('role_name', '') pms = request.POST.getlist('pms', []) # 表单校验 role_form = RoleForm({ 'role_row_id': role_row_id, 'role_code': role_code, 'role_name': role_name, 'pms': pms }) # 表单校验 if not role_form.is_valid(): return render(request, 'role_form.html', {'form': role_form) role_row_id = role_form.cleaned_data.get('role_row_id', None) if role_row_id: # 角色更新 return update_role(request, role_form, role_row_id=role_row_id, role_code=role_code, role_name=role_name, pms=pms) else: # 角色创建 return add_role(request, role_form, role_code, role_name, pms=pms) else: # 角色编辑页面 role_row_id = request.GET.get('id') try: role_item = Role.objects.get(pk=role_row_id) except Role.DoesNotExist as e: role_item = None if role_item: # 编辑已有角色表单 # 获取角色权限列表 role_pms_rows = RolePermission.objects.filter(role_code=role_item.role_code) pms_codes = [role_pms_row.pms_code for role_pms_row in role_pms_rows] role_form = RoleForm({ 'role_row_id': role_row_id, 'role_code': role_item.role_code, 'role_name': role_item

转载于:https://www.cnblogs.com/floodwater/p/9987308.html

Django 基于角色的权限控制相关推荐

  1. AspNetForums中基于角色的权限控制

    AspNetForums中基于角色的权限控制 http://blog.joycode.com/dotey/archive/2005/02/24/44791.aspx asp.net页面如何控制页面依据 ...

  2. 基于角色的权限控制模型RBAC

    本文来说下基于角色的权限控制模型RBAC 文章目录 概述 RBAC权限模型简介 RBAC的演化进程 用户与权限直接关联 一个用户拥有一个角色 一个用户一个或多个角色 页面访问权限与操作权限 数据权限 ...

  3. 图文详解基于角色的权限控制模型RBAC

    我们开发一个系统,必然面临权限控制的问题,即不同的用户具有不同的访问.操作.数据权限.形成理论的权限控制模型有:自主访问控制(DAC: Discretionary Access Control).强制 ...

  4. 部门角色权限rbac_k8s十 | 一文读懂基于角色的权限控制RBAC

    一.ServiceAccount . 1. ServiceAccount 介绍 首先Kubernetes中账户区分为:User Accounts(用户账户) 和 Service Accounts(服务 ...

  5. IdentityServer4实战 - 基于角色的权限控制及Claim详解

    一.前言 大家好,许久没有更新博客了,最近从重庆来到了成都,换了个工作环境,前面都比较忙没有什么时间,这次趁着清明假期有时间,又可以分享一些知识给大家.在QQ群里有许多人都问过IdentityServ ...

  6. 版本管理:Subversion Edge:角色与权限控制

    这篇文章介绍一下Subverison Edge中内置的角色和权限控制方式和Edge所提供的页面操作功能. 环境和事前准备 Subversion Edge环境准备和仓库创建的操作可参看如下文章: htt ...

  7. 一个基于角色的权限控制系统

    基于角色的权限控制也就是说通过角色,来控制用户访问的模块,不同的用户拥有不同的角色,将具有不同的访问权限. 系统截图 菜单管理,菜单也就是权限,拥有什么样的菜单就表示拥有什么样的权限,为了降低复杂性, ...

  8. RBAC(基于角色的权限访问控制)

    第一节.RBAC简介 英文全称(Role-Based Access Control) 中文全称:基于角色的权限访问控制 rbac: 一种数据库设计思想,根据设计数据库设计方案,完成项目的权限控制. 经 ...

  9. spring boot shiro redis整合基于角色和权限的安全管理-Java编程

    一.概述 本博客主要讲解spring boot整合Apache的shiro框架,实现基于角色的安全访问控制或者基于权限的访问安全控制,其中还使用到分布式缓存redis进行用户认证信息的缓存,减少数据库 ...

最新文章

  1. 小裁缝返乡创业做儿童品牌,如今身家数十亿冲刺上市
  2. C语言中的各输出格式含义
  3. [React Native]高度自增长的TextInput组件
  4. mysql函数和索引冲突问题_Mysql索引常见问题汇总
  5. php面试宝典1000题,【PHP面试宝典1000题】HTTP中的请求头(深圳小美网络科技)
  6. java.exe闪退_Tomcat7.0 exe闪退问题
  7. sts 明明导包正确却报错_这真是危险的关系,明明你错了,但是她认了!
  8. Ground Turth在深度学习中的意思
  9. Codeforces Round #310 (Div. 1) B. Case of Fugitive set
  10. 源码分析三:OkHttp(2)—拦截器简介
  11. 计算机组装在线作业_1,中石油华东《计算机维护技术》2018年秋学期在线作业(三).doc...
  12. Linux安装rsync命令失败,rsync 常见错误与解决方法整理
  13. UGUI ContentSizeFitter 嵌套 适配
  14. 大一大学计算机期末试卷,大一大学计算机基础教程期末考试题
  15. c++中STL库 简介 及 使用说明
  16. C语言中%d %.2d %2d %02d的区别
  17. 基金认购与申购的区别
  18. 愿与你同行作一个终身学习者
  19. VS中的链接重复问题
  20. 基于openVR实现任意软件界面映射到VR眼镜

热门文章

  1. python学成什么样可以找工作-Python 爬虫学到什么样就可以找工作了?
  2. 成都python工作-成都找工作|成都人才网|成都全职招聘信息-成都58同城
  3. python中需要用到的英文词汇-使用python从语料库中提取最常用的单词
  4. 自学python可以找到好的工作吗-27岁0基础自学Python,多久可以找到工作?
  5. codeforces D MUH and Cube Walls(kmp)
  6. Win8上安装天翼宽带运行提示停止运行的问题
  7. Laravel 事件侦听的几个方法 [Trait, Model boot(), Observer Class]
  8. bzoj 1827: [Usaco2010 Mar]gather 奶牛大集会【树形dp】
  9. 2018.3.31 设计模式之生成器模式详解及例子(对象创建型模式)
  10. 刷题总结——魔法森林(bzoj3669)