RBAC(Role-Based Access Control,基于角色的访问控制)就是用户通过角色与权限进行关联。简单地说,一个用户拥有若干角色,每一个角色拥有若干权限。这样,就构造成“用户-角色-权限”的授权模型。在这种模型中,用户与角色之间,角色与权限之间,一般者是多对多的关系。

简单的权限:如下就是一个简单的权限设计模式,其中包含了用户表,角色表,权限表。

 
图片.png

稍微复杂一点的权限,可能设计到用户表、权限表、角色表、用户组表、额外的权限表,在django中提供了这一些列的权限相关模型,关于权限设计中表的关联关系如下:

 
图片.png

)

1. Django的权限项

Django用permission对象存储权限项,每个model默认都有三个permission,即add model, change model和delete model。例如,定义一个名为学生Student模型,当迁移表后,会在auth_permission中自动创建相应的三个permission:add_student, change_student和delete_student。Django还允许自定义permission。

 
图片.png

2. 创建权限

1) 自定义权限

在自定义模型的Meta元中添加permissions参数,自定义权限的名称(‘codename’,‘name’)即codename为权限名,name为权限的描述。在数据库的auth_permission表中还有一个content_type字段,其表示prmission属于哪个model

from django.db import models

class Users(AbstractUser):
"""
管理员---拓展User表
"""
class Meta:
permissions = (
('add_user_per', '添加用户权限'),
('del_user_per', '删除用户权限'),
('change_user_per', '修改用户权限'),
('sel_user_per', '查询用户权限')
)

并在settings.py文件中添加如下设置:

AUTH_USER_MODEL = 'users.Users'

注意:在数据库的auth_permission表中,会新增权限,包括自带的对Users管理的权限,和自定义的四个权限。

如下所示:

[图片上传失败...(image-ee6095-1537444192584)]

2)创建权限

上面的方法是在定义模型的时候自定义权限,也可理解为创建系统的内置权限,如果涉及到在业务逻辑中创建权限,则可以通过Permission模型来创建权限

url(r'^add_user_permission/', views.add_user_permission,name='add_user_permission'),

from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType
from django.http import HttpResponse from users.models import Users def add_user_permission(request):
if request.method == 'GET':
# 获取当前Users模型的id值
content_type = ContentType.objects.get_for_model(Users)
# codename为权限名,name为描述,content_type为当前权限属于哪一个模型的ID
Permission.objects.create(codename='add_other_user_permission',
name='添加其他用户权限',
content_type=content_type)
return HttpResponse('创建权限成功')

3.分配权限

1)给用户直接添加某种权限

采用直接分配权限的方法,给用户添加额外的权限既用户表Users和权限Permission模型以及中间表user_permission之间的关联关系。用户Users模型和权限Permission之间是ManyToManyField()多对多关联关系,关联字段为user_permission。

语法:

添加权限:user对象.user_permission.add(permission对象1, permission对象2)

删除权限:user对象.user_permission.remove(permission对象1, permission对象2)

清空权限:user对象.user_permission.clear()

url(r'^add_permission/', views.add_permission, name='add_permission'),

from django.contrib.auth.models import Permission, User

def add_permission(request):
if request.method == 'GET':
# 获取id=1d的用户对象
user = Users.objects.get(id=1)
# 给该用户添加权限
pers = Permission.objects.filter(codename__in=['add_user_per', 'del_user_per'])
for per in pers:
# 添加用户权限
user.user_permissions.add(per)
#删除权限
# user.user_permissions.remove(per)
# 清空权限
user.user_permissions.clear()
return HttpResponse('创建权限成功')

2)创建组并分配对应组的权限

给组添加权限,涉及到组group表和permission权限表,以及中间关联表。其为ManyToManyFiled()关联关系,关联字段为permissions 语法:

添加权限:group对象.permissions.add(permission对象1, permission对象2)

删除权限:group对象.permissions.remove(permission对象1, permission对象2)

清空权限:group对象.permissions.clear()

url(r'^group_permission/', views.group_permission, name='group_permission'),

def group_permission(request):
if request.method == 'GET':
# 创建超级管理用户组并给用户组增加对用户进行CRUD的权限
super_group = Group.objects.create(name='超级管理员')
pers = Permission.objects.filter(codename__in=['add_user_per', 'del_user_per', 'change_user_per', 'sel_user_per'])
for per in pers:
# 添加超级用户组的权限
super_group.permissions.add(per)
# 删除超级组的权限
super_group.permissions.remove(per)
# 清空组的权限
super_group.permissions.clear()
return HttpResponse('创建组权限')

3)分配用户和权限组

给用户添加组权限,涉及到组group表和user用户表,以及中间关联表。其为ManyToManyFiled()关联关系,关联字段为groups 语法:

添加权限:user对象.groups.add(groups对象1, groups对象2)

删除权限:user对象.groups.remove(groups对象1, groups对象2)

清空权限:user对象.groups.clear()

url(r'^user_group/', views.user_group, name='user_group'),

def user_group(request):
if request.method == 'GET':
# 给id为1的用户分配超级管理员组的权限
# 获取超级管理员组group对象
super_group = Group.objects.get(name='超级管理员')
# 获取id=1d的用户对象
user = Users.objects.get(id=1)
# 添加超级用户组的权限
user.groups.add(super_group)
# 删除超级组的权限
# user.groups.remove(super_group)
# 清空组的权限
# user.groups.clear()
return HttpResponse('创建用户组权限')

4. 检测用户是否有某权限,和所有权限,组权限

语法:用户对象.has_perm('模型名.权限codename')

查询用户所有的权限:user.get_all_permissions()方法列出用户的所有权限,返回值是permission name

查询用户的组权限:user.get_group_permissions()方法列出用户所属group的权限,返回值是permission name

def user_permission(request):
if request.method == 'GET':
# 获取id=1d的用户对象
user = Users.objects.get(id=1)
# 查看用户的所有权限
all_perm = user.get_all_permissions()
# 查看用户的组权限
group_perm = user.get_group_permissions()
# 查询用户是否有add_user_per权限
if user.has_perm('users.add_user_per'):
return HttpResponse('用户有add_user_per权限')
else:
return HttpResponse('用户没有add_user_per权限')

5. 权限校验,使用permission_required装饰器

使用permission_required对权限进行校验,如果没有当前登录系统的用户没有该权限则跳转到登录页面,如果当前用户有该权限,则进行访问对应的视图函数。

语法:@permission_required('应用app名.权限名codename')

url(r'^add_user_html/', views.add_user_html, name='add_user_html'),

from django.contrib.auth.decorators import permission_required

@permission_required('users.add_users')
def add_user_html(request):
if request.method == 'GET':
return HttpResponse('该方法需要添加用户权限才可访问')

6. 测试

定义登录的路由,并实现登录操作,当用户登录后,再次访问add_user_html路由地址,则可以访问到对应的视图函数,如果用户没有登录则因为权限问题访问不了add_user_html路由对应的视图函数。

7. 首页index.html中通过权限控制按钮

在模版中使用:模版中使用全局变量perms存储当前用户的所有权限。通过{{ perms.应用名 }}可打印出所有的权限。

在模板中也可以直接通过{{ user }}获取当前登录系统的用户信息。

使用语法格式:

{% if perms.应用名.权限标识 %}
<!-- 这里是有权限才显示的内容 -->
{% endif %}

首页index.html中如下控制按钮的权限:

{% extends 'base.html' %}

{% block title %}
首页
{% endblock %} {% block content %} <!--模版中使用全局变量perms存储当前用户的所有权限-->
{{ perms.users }}
<!--判断当前用户是否为超级管理员-->
{{ user.is_superuser }} {% if user.is_superuser or perms.users.add_user_per %}
<p>添加用户管理</p>
{% endif %}
{% if user.is_superuser or perms.users.del_user_per %}
<p>删除用户管理</p>
{% endif %}
{% if user.is_superuser or perms.users.change_user_per %}
<p>修改用户管理</p>
{% endif %}
{% if user.is_superuser or perms.users.sel_user_per %}
<p>查询用户管理</p>
{% endif %}
{% endblock %}

Django-用户权限,用户角色使用指南的更多相关文章

  1. 项目一:第十三天 1、菜单数据管理 2、权限数据管理 3、角色数据管理 4、用户数据管理 5、在realm中动态查询用户权限,角色 6、Shiro中整合ehcache缓存权限数据

    1 课程计划 菜单数据管理 权限数据管理 角色数据管理 用户数据管理 在realm中动态查询用户权限,角色 Shiro中整合ehcache缓存权限数据         2 菜单数据添加 2.1 使用c ...

  2. oracle查询用户权限及角色(摘)

    1.查看所有用户: select * from dba_users; select * from all_users; select * from user_users; 2.查看用户或角色系统权限( ...

  3. oracle用户权限和角色

    用户权限是最基本的数据库安全控制.其作用就是控制用户对数据的访问,sql语句的执行.当oracle用户创建的时候,可以通过授权来控制用户对数据的连接,数据库对象的操作等等. 在oracle中,分为两种 ...

  4. Jenkins系列-Jenkins用户权限和角色配置

    由于jenkins默认的权限管理体系不支持用户组或角色的配置,因此需要安装第三发插件来支持角色的配置,这边将使用Role Strategy Plugin,介绍页面:https://wiki.jenki ...

  5. Oracle的用户权限和角色

    用户和权限 LOCK|UNLOCK创建用户时是否锁定,默认为锁定状态.锁定的用户无法正常的登录进行数据库操作. --给普通用户SCOTT解锁,同时把SCOTT用户的密码进行修改 --语法结构:ALTE ...

  6. Linux添加用户/权限/用户主目录等相关

    一. 用户主目录 useradd -d   ${path}   username -d命令是指定用户主目录, 添加完之后  su -  username 默认会转到 这个用户的主目录下,即 ${pat ...

  7. 开发指南专题十一:JEECG微云高速开发平台--基础用户权限

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/zhangdaiscott/article/details/26580037     开发指南专题 ...

  8. 附2 rabbitmq用户管理、角色管理与权限管理

    本文摘自:http://my.oschina.net/hncscwc/blog/262246 1. 用户管理 用户管理包括增加用户,删除用户,查看用户列表,修改用户密码. 相应的命令 (1) 新增一个 ...

  9. 转 oracle 学习- 用户权限角色

    创建和删除用户是Oracle用户管理中的常见操作,但这其中隐含了Oracle数据库系统的系统权限与对象权限方面的知识.掌握还Oracle用户的授权操作和原理,可以有效提升我们的工作效率. Oracle ...

  10. Oracle 用户权限管理方法

    Oracle 用户权限管理方法 sys;//系统管理员,拥有最高权限 system;//本地管理员,次高权限 scott;//普通用户,密码默认为tiger,默认未解锁 sys;//系统管理员,拥有最 ...

随机推荐

  1. Python爬虫入门教程:豆瓣Top电影爬取

        基本开发环境 Python 3.6 Pycharm 相关模块的使用 requests parsel csv 安装Python并添加到环境变量,pip安装需要的相关模块即可. 爬虫基本思路 一. ...

  2. Educational Codeforces Round 90 (Rated for Div. 2) A. Donut Shops(数学)

    题目链接:https://codeforces.com/contest/1373/problem/A 题意 有两种包装的甜甜圈,第一种 $1$ 个 $a$ 元,第二种 $b$ 个 $c$ 元,问买多少 ...

  3. HDU 6852 Increasing and Decreasing 构造

    题意: 给你一个n,x,y.你需要找出来一个长度为n的序列,使得这个序列满足最长上升子序列长度为x,最长下降子序列长度为y.且这个序列中每个数字只能出现一次 且要保证最后输出的序列的字典序最小 题解: ...

  4. Redundant Paths POJ - 3177 把原图变成边—双连通图

    无向图概念:(这里的x->y表示x和y之间有一条无向边)1.桥:对于一个无向图,如果删除某条边后,该图的连通分量增加,则称这条边为桥 比如1->2->3->4这样一个简单得图一 ...

  5. QT串口助手(五):文件操作

    作者:zzssdd2 E-mail:zzssdd2@foxmail.com 一.前言 开发环境:Qt5.12.10 + MinGW 功能 文件的发送 数据的保存 知识点 QFile类的使用 QTime ...

  6. Nginx基础 - Nginx+Lua实现灰度发布与WAF

    1.Nginx加载Lua环境默认情况下Nginx不支持Lua模块, 需要安装LuaJIT解释器, 并且需要重新编译Nginx, 建议使用openrestry 1)环境准备 [root@localhos ...

  7. 涂颜色的RPG问题

    长度为n的方格,刷3种颜色的颜料,相邻的方格颜料颜色不能相同,且首尾方格颜色不能相同.每个方格必须涂色.计算一共有多少种涂色方式. 解题思路:(1)f(1)=3,f(2)=6,f(3)=6 (2)如果 ...

  8. 为树莓派3B添加LCD1602液晶屏

    树莓派3B针脚说明 LCD1602接线说明 VSS,接地VDD,接5V电源VO,液晶对比度调节,接电位器中间的引脚,电位器两边的引脚分别接5V和接地.RS,寄存器选择,接GPIO14RW,读写选择,接 ...

  9. Netty(六)揭开 BootStrap 的神秘面纱

    6.1 客户端 BootStrap 6.1.1 Channel 简介 在 Netty 中,Channel 是一个 Socket 的抽象,它为用户提供了关于 Socket 状态(是否是连接还是断开)以及 ...

  10. Google reCAPTCHA 2 : Protect your site from spam and abuse & Google reCAPTCHA 2官方教程

    1