Django 基于角色的权限控制
ENV: Python3.6 + django1.11
应用场景
有一种场景, 要求为用户赋予一个角色, 基于角色(比如后管理员,总编, 编辑), 用户拥有相应的权限(比如管理员拥有所有权限, 总编可以增删改查, 编辑只能增改, 有些页面的按钮也只有某些角色才能查看), 角色可以任意添加, 每个角色的权限也可以任意设置
django 的权限系统
django 默认的权限是基于Model
的add, change, delete来做权限判断的, 这种设计方式有一个明显的缺陷, 比如怎么控制对Model
的某个字段的修改的权限的控制呢
设计权限
大多数的系统, 都会给用户赋予某个角色, 假如能针对用户的角色, 做权限控制,这个权限控制并不局限于对Model
的修改, 可以是任意位置的权限控制, 只要有一个权限名, 即可根据用户角色名下是否拥有权限名判断是否拥有权限
User, Role => UserRole => RolePermissions
User 是用户对象
Role: 角色表
UserRole 是用户角色关系对象
RolePermissions 是角色权限关系对象
因此, 需要创建三个Model
: User
,Role
, UserRole
, RolePermission
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 基于角色的权限控制相关推荐
- AspNetForums中基于角色的权限控制
AspNetForums中基于角色的权限控制 http://blog.joycode.com/dotey/archive/2005/02/24/44791.aspx asp.net页面如何控制页面依据 ...
- 基于角色的权限控制模型RBAC
本文来说下基于角色的权限控制模型RBAC 文章目录 概述 RBAC权限模型简介 RBAC的演化进程 用户与权限直接关联 一个用户拥有一个角色 一个用户一个或多个角色 页面访问权限与操作权限 数据权限 ...
- 图文详解基于角色的权限控制模型RBAC
我们开发一个系统,必然面临权限控制的问题,即不同的用户具有不同的访问.操作.数据权限.形成理论的权限控制模型有:自主访问控制(DAC: Discretionary Access Control).强制 ...
- 部门角色权限rbac_k8s十 | 一文读懂基于角色的权限控制RBAC
一.ServiceAccount . 1. ServiceAccount 介绍 首先Kubernetes中账户区分为:User Accounts(用户账户) 和 Service Accounts(服务 ...
- IdentityServer4实战 - 基于角色的权限控制及Claim详解
一.前言 大家好,许久没有更新博客了,最近从重庆来到了成都,换了个工作环境,前面都比较忙没有什么时间,这次趁着清明假期有时间,又可以分享一些知识给大家.在QQ群里有许多人都问过IdentityServ ...
- 版本管理:Subversion Edge:角色与权限控制
这篇文章介绍一下Subverison Edge中内置的角色和权限控制方式和Edge所提供的页面操作功能. 环境和事前准备 Subversion Edge环境准备和仓库创建的操作可参看如下文章: htt ...
- 一个基于角色的权限控制系统
基于角色的权限控制也就是说通过角色,来控制用户访问的模块,不同的用户拥有不同的角色,将具有不同的访问权限. 系统截图 菜单管理,菜单也就是权限,拥有什么样的菜单就表示拥有什么样的权限,为了降低复杂性, ...
- RBAC(基于角色的权限访问控制)
第一节.RBAC简介 英文全称(Role-Based Access Control) 中文全称:基于角色的权限访问控制 rbac: 一种数据库设计思想,根据设计数据库设计方案,完成项目的权限控制. 经 ...
- spring boot shiro redis整合基于角色和权限的安全管理-Java编程
一.概述 本博客主要讲解spring boot整合Apache的shiro框架,实现基于角色的安全访问控制或者基于权限的访问安全控制,其中还使用到分布式缓存redis进行用户认证信息的缓存,减少数据库 ...
最新文章
- 小裁缝返乡创业做儿童品牌,如今身家数十亿冲刺上市
- C语言中的各输出格式含义
- [React Native]高度自增长的TextInput组件
- mysql函数和索引冲突问题_Mysql索引常见问题汇总
- php面试宝典1000题,【PHP面试宝典1000题】HTTP中的请求头(深圳小美网络科技)
- java.exe闪退_Tomcat7.0 exe闪退问题
- sts 明明导包正确却报错_这真是危险的关系,明明你错了,但是她认了!
- Ground Turth在深度学习中的意思
- Codeforces Round #310 (Div. 1) B. Case of Fugitive set
- 源码分析三:OkHttp(2)—拦截器简介
- 计算机组装在线作业_1,中石油华东《计算机维护技术》2018年秋学期在线作业(三).doc...
- Linux安装rsync命令失败,rsync 常见错误与解决方法整理
- UGUI ContentSizeFitter 嵌套 适配
- 大一大学计算机期末试卷,大一大学计算机基础教程期末考试题
- c++中STL库 简介 及 使用说明
- C语言中%d %.2d %2d %02d的区别
- 基金认购与申购的区别
- 愿与你同行作一个终身学习者
- VS中的链接重复问题
- 基于openVR实现任意软件界面映射到VR眼镜
热门文章
- python学成什么样可以找工作-Python 爬虫学到什么样就可以找工作了?
- 成都python工作-成都找工作|成都人才网|成都全职招聘信息-成都58同城
- python中需要用到的英文词汇-使用python从语料库中提取最常用的单词
- 自学python可以找到好的工作吗-27岁0基础自学Python,多久可以找到工作?
- codeforces D MUH and Cube Walls(kmp)
- Win8上安装天翼宽带运行提示停止运行的问题
- Laravel 事件侦听的几个方法 [Trait, Model boot(), Observer Class]
- bzoj 1827: [Usaco2010 Mar]gather 奶牛大集会【树形dp】
- 2018.3.31 设计模式之生成器模式详解及例子(对象创建型模式)
- 刷题总结——魔法森林(bzoj3669)