文档章节

我对Django权限控制的理解

Harmel
 Harmel
发布于 2016/10/09 09:38
字数 924
阅读 2467
收藏 4

基于角色的权限系统

       现在各大系统都采用的是基于角色的权限控制,这里就涉及到三个东西:用户、角色、资源(权限),在Django中就是:用户、用户组、权限。用户和角色的关系一般为多对多,角色和资源的关系也为多对多,如下图(此图来源于互联网)

       这样设计有一个好处,就是在系统越来越大的时候如果给每个用户逐一赋予权限非常麻烦和繁琐,只需要给角色赋予相应的权限用户赋予他对应的角色即可,如果有新的需求只需要添加有相应权限的角色即可。

Django权限机制的实现

1、不依赖于Django中的权限模型

       设计三个实体类User、Role、Resource分别对应上面提出的用户、角色、资源,User和Resource之间为多对多的关系,Role和Resource之间为多对多的关系。User中封装的是用户的信息如用户名密码等,Resource可以封装权限标识(后面再进行分析)也可以封装允许访问的URL地址。

       编写装饰器对视图处理方法进行拦截

  • 资源封装URL

            在装饰器中获取当前访问的URL,取出当前用户(从Session中取,前题是在登录的时候需要把用户信息放去Session中去),迭代判断用户的所有角色绑定的资源中的URL,如果存在与当前访问URL相同的地址则放行,否则则跳转到无权限的页面。

            弊端:如果URL发生了变动需要修改资源(权限)

  • 资源封装权限标识

            在装饰器标示在视图处理方法上时传入权限标识参数(如:@auth("user:add")),在装饰器中也是从Session中获取用户,迭代用户的所有角色绑定的资源中的权限标识,如果与传入装饰器中的权限标识相同则放行,否则跳转到无权限的页面。

            好处:如果URL发生了变动无需修改资源(权限),Django内部的权限系统就是采用的这种方式,Java目前越来越流行的权限控制框架Shiro也是采用的这种方式

2、依赖于Django中的权限模型(部分摘抄于:http://www.jianshu.com/p/01126437e8a4

         Django用User、Group、Permission来表示上面的用户、角色、资源(权限),在Django中不管你是否使用其自带的权限控制只要你继承了他的模型类(models.Model)会默认在auth_permission表中插入三个权限信息(以Book为例,会插入如下三个权限信息:add_book、change_book、delete_book,分别代表了添加、修改、删除三个权限),如果需要更多的权限信息可以在定义实体的时候如下定义:

class Book(models.Model):
    name = models.CharField()

    class Meta:
        permissions = (
            ('自定义的权限标识', '权限说明信息'),
        )

        每个permission都是django.contrib.auth.Permission类型的实例,该类型包含三个字段name, codename 和 content_type,其中 content_type反应了permission属于哪个model(如上就是Book),codename就是权限标识,代码逻辑中检查权限时要用, name是permission的描述显示的时候会用到。

        权限检测装饰器:request.user封装了当前登录系统的用户

from django.contrib.auth.decorators import permission_required

@permission_required('应用名.权限标识')
def view(request):
    ....

       在模版中使用:模版中使用全局变量perms存储当前用户的所有权限

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

© 著作权归作者所有

共有 人打赏支持
Harmel
粉丝 9
博文 33
码字总数 14582
作品 0
武汉
程序员
加载中

评论(3)

zhangqunshi
zhangqunshi

引用来自“zhangqunshi”的评论

如果是restful方式,怎么在view中判断权限信息?

引用来自“Harmel”的评论

request.user能拿到登录用户呀,request.user.user_permissions.all()能拿到所有权限信息!
谢谢,我已经知道了,你这回答历时一年呀。
Harmel
Harmel

引用来自“zhangqunshi”的评论

如果是restful方式,怎么在view中判断权限信息?
request.user能拿到登录用户呀,request.user.user_permissions.all()能拿到所有权限信息!
zhangqunshi
zhangqunshi
如果是restful方式,怎么在view中判断权限信息?
3.运维平台之账户系统

历程: 0. 账户系统(accounts)分为用户认证和权限分配两部分. 1. 刚开始运维平台业务比较单一,只提供给运维组人员使用即可,根本没有用户账号的概念. 2. django系统本身有用户、用户组、权限,...

ending123
01/09
0
0
[Python学习] Django 权限控制

本文为大家讲解 Django 框架里自带的权限模型,从理论到实战演练,带领大家了解 Django 里权限是怎么一回事。 主要内容 什么是权限管理? Web 权限 Django 权限机制 Django 的权限项 权限应用...

xjtuhit
2017/09/12
0
0
Django之路- 如何开发通用且万能的的权限框架组件

今天老男孩IT教育Python教学总监alex带你开通Django之路 需求讨论 权限设计 代码设计 自定义权限钩子 业务场景分析 假设我们在开发一个培训机构的客户关系管理系统系统分客户管理、学员管理、...

alex3714
2017/04/05
0
0
Django之路- 如何开发通用且万能的的权限框架组件

今天老男孩IT教育Python教学导师吴sir带你开通Django之路 需求讨论 权限设计 代码设计 自定义权限钩子 业务场景分析 假设我们在开发一个培训机构的客户关系管理系统系统分客户管理、学员管理...

米斯特赛文
2017/04/06
0
0
Django基础(三)session会话、认证系统、内容分页、中间件

一、Cookies & Session Cookies: 由于http协议是无状态的在一次请求和下一次请求之间没有任何状态保持我们无法根据请求的任何方面来识别来自同一人的连续请求。然而浏览器的开发者在很早的时...

qw87112
06/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

C++ std::thread

C++11提供了std::thread类来表示一个多线程对象。 1,首先介绍一下std::this_thread命名空间: (1)std::this_thread::get_id():返回当前线程id (2)std::this_thread::yield():用户接口...

yepanl
47分钟前
2
0
Nignx缓存文件与动态文件自动均衡的配置

下面这段nginx的配置脚本的作用是,自动判断是否存在缓存文件,如果有优先输出缓存文件,不经过php,如果没有,则回到php去处理,同时生成缓存文件。 PHP框架是ThinkPHP,最后一个rewrite有关...

swingcoder
51分钟前
1
0
20180920 usermod命令与用户密码管理

命令 usermod usermod 命令的选项和 useradd 差不多。 一个用户可以属于多个组,但是gid只有一个;除了gid,其他的组(groups)叫做扩展组。 usermod -u 1010 username # 更改用户idusermod ...

野雪球
52分钟前
1
0
Java网络编程基础

1. 简单了解网络通信协议TCP/IP网络模型相关名词 应用层(HTTP,FTP,DNS等) 传输层(TCP,UDP) 网络层(IP,ICMP等) 链路层(驱动程序,接口等) 链路层:用于定义物理传输通道,通常是对...

江左煤郎
59分钟前
1
0
使用xtrabackup完成远程备份

转载收藏,以防丢失 需求 Can I backup remote databases from my local server02-27-2013, 06:17 AMHi, I am using mysqldump so far for taking daily backups of my Production datab......

阿dai
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部