文档章节

我对Django权限控制的理解

Harmel
 Harmel
发布于 2016/10/09 09:38
字数 924
阅读 1798
收藏 4
点赞 1
评论 3

基于角色的权限系统

       现在各大系统都采用的是基于角色的权限控制,这里就涉及到三个东西:用户、角色、资源(权限),在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

[Python学习] Django 权限控制

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

xjtuhit ⋅ 2017/09/12 ⋅ 0

Django基础(三)session会话、认证系统、内容分页、中间件

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

qw87112 ⋅ 2016/06/09 ⋅ 0

Spring 和 Django 安全机制的比较

做了一年多的python 方面的web开发工作,昨个有个同学问我Django的安全机制,我是一脸的茫然。每天使用公司开发框架的我,对这些东西了解的甚少,俨然成为一个真正的"码农",只知其然而不知其...

北方攻城师 ⋅ 2014/10/13 ⋅ 0

Django之路- 如何开发通用且万能的的权限框架组件

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

alex3714 ⋅ 2017/04/05 ⋅ 0

Django之路- 如何开发通用且万能的的权限框架组件

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

米斯特赛文 ⋅ 2017/04/06 ⋅ 0

一天学会开发客户关系管理系统

本节内容 需求讨论 权限设计 代码设计 自定义权限钩子 业务场景分析 本节课老男孩教育ALEX教你假设我们在开发一个培训机构的 客户关系管理系统,系统分客户管理、学员管理、教学管理3个大模块...

米斯特赛文 ⋅ 2017/04/17 ⋅ 0

基于 Django1.5自定义user模型

今天看到 http://my.oschina.net/lxcong/blog/145260这篇 blog有感,所以将自己的使用经验整理出来给大家做一个参考。 Django自带的user模型在权限粒度切分,session控制,用户认证方面整合的很...

AlanShi ⋅ 2013/07/20 ⋅ 24

Python 管理后台--sadmin

sadmin是用python Django开发的后台用户管理系统,包含完善的用户管理和权限管理功能,最大的特色是根据URL来定义方便的权限管理。 开发语言: sadmin后台采用Django开发,前台采用Bootstrap...

提上日程 ⋅ 2015/01/14 ⋅ 0

15款Django开发常用软件包

是一款高级的Python Web框架,可以帮助开发者快速创建web应用。我们这里整理了15款Django开发中常用的软件包,学会使用它们可以节省大量开发时间,提高开发效率。同时,也给出了它们的pip安装...

xiaoge2016 ⋅ 04/20 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Jenkins实践3 之脚本

#!/bin/sh# export PROJ_PATH=项目路径# export TOMCAT_PATH=tomcat路径killTomcat(){pid=`ps -ef | grep tomcat | grep java|awk '{print $2}'`echo "tom...

晨猫 ⋅ 今天 ⋅ 0

Spring Bean的生命周期

前言 Spring Bean 的生命周期在整个 Spring 中占有很重要的位置,掌握这些可以加深对 Spring 的理解。 首先看下生命周期图: 再谈生命周期之前有一点需要先明确: Spring 只帮我们管理单例模...

素雷 ⋅ 今天 ⋅ 0

zblog2.3版本的asp系统是否可以超越卢松松博客的流量[图]

最近访问zblog官网,发现zlbog-asp2.3版本已经进入测试阶段了,虽然正式版还没有发布,想必也不久了。那么作为aps纵横江湖十多年的今天,blog2.2版本应该已经成熟了,为什么还要发布这个2.3...

原创小博客 ⋅ 今天 ⋅ 0

聊聊spring cloud的HystrixCircuitBreakerConfiguration

序 本文主要研究一下spring cloud的HystrixCircuitBreakerConfiguration HystrixCircuitBreakerConfiguration spring-cloud-netflix-core-2.0.0.RELEASE-sources.jar!/org/springframework/......

go4it ⋅ 今天 ⋅ 0

二分查找

二分查找,也称折半查找、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于...

人觉非常君 ⋅ 今天 ⋅ 0

VS中使用X64汇编

需要注意的是,在X86项目中,可以使用__asm{}来嵌入汇编代码,但是在X64项目中,再也不能使用__asm{}来编写嵌入式汇编程序了,必须使用专门的.asm汇编文件来编写相应的汇编代码,然后在其它地...

simpower ⋅ 今天 ⋅ 0

ThreadPoolExecutor

ThreadPoolExecutor public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, ......

4rnold ⋅ 昨天 ⋅ 0

Java正无穷大、负无穷大以及NaN

问题来源:用Java代码写了一个计算公式,包含除法和对数和取反,在页面上出现了-infinity,不知道这是什么问题,网上找答案才明白意思是负的无穷大。 思考:为什么会出现这种情况呢?这是哪里...

young_chen ⋅ 昨天 ⋅ 0

前台对中文编码,后台解码

前台:encodeURI(sbzt) 后台:String param = URLDecoder.decode(sbzt,"UTF-8");

west_coast ⋅ 昨天 ⋅ 0

实验楼—MySQL基础课程-挑战3实验报告

按照文档要求创建数据库 sudo sercice mysql startwget http://labfile.oss.aliyuncs.com/courses/9/createdb2.sqlvim /home/shiyanlou/createdb2.sql#查看下数据库代码 代码创建了grade......

zhangjin7 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部