文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习

本文记录使用django自带的认证系统实现自定义的权限管理系统,包含组权限、用户权限等实现。

0x01. django认证系统

django自带的认证系统能够很好的实现如登录、登出、创建用户、创建超级用户、修改密码等复杂操作,并且实现了用户组、组权限、用户权限等复杂结构,使用自带的认证系统就能帮助我们实现自定义的权限系统达到权限控制的目的。

0x02. 认证系统User对象

User对象顾名思义即为表示用户的对象,里面的属性包括:

username
password
email
first_name
last_name
is_superuser
is_active

创建好对象后,django会自动生成表,表名为auth_user,包含以上字段。具体的api文档如下所示:

class models.User

User 对象具有如下字段:

username
必选。少于等于30个字符。 用户名可以包含字母、数字、_、@、+、.和- 字符。

first_name
可选。 少于等于30个字符。

last_name
可选。少于30个字符。

email
可选。邮箱地址。

password
必选。 密码的哈希及元数据。(Django 不保存原始密码)。原始密码可以无限长而且可以包含任意字符。参见密码相关的文档。

groups
与Group 之间的多对多关系。

user_permissions
与Permission 之间的多对多关系。

is_staff
布尔值。指示用户是否可以访问Admin 站点。

is_active
布尔值。指示用户的账号是否激活。

is_superuser
布尔值。只是这个用户拥有所有的权限而不需要给他们分配明确的权限。

last_login
用户最后一次登录的时间。

date_joined
账户创建的时间。当账号创建时,默认设置为当前的date/time。

一般在注册操作中会用到该方法,实现注册一个用户,用到的函数是User.objects.create_user(),在新建用户的时候需要判断用户是否存在,我的实现方式是,User.objects.get(username=xxx)去获取一个用户User对象,用try except实现,如果用户不存在则抛出User.DoesNotExist异常,在这个异常中进行创建用户的操作。具体代码如下:

# 注册操作
from django.contrib.auth.models import User

try:
User.objects.get(username=username)
data = {‘code’: ‘-7’, ‘info’: u’用户已存在’}
except User.DoesNotExist:
user = User.objects.create_user(username, email, password)
if user is not None:
user.is_active = False
user.save()

该过程中密码字段会自动加密存储。无需关注过多细节。

0x03. 登录登出用户

创建好用户后,就是登录及登出了,django认证系统提供了login()及logout()函数,能够自动登录登出,并且修改session值,非常方便。验证用户身份使用authenticate函数能自动进行password字段的hash比对。

具体实现代码如下:

from django.contrib.auth import authenticate, login, logout

认证操作

ca = Captcha(request)
if ca.validate(captcha_code):
user = authenticate(username=username, password=password)
if user is not None:
if user.is_active:

登录成功

login(request, user) # 登录用户
data = {‘code’: ‘1’, ‘info’: u’登录成功’, ‘url’: ‘index’}
else:
data = {‘code’: ‘-5’, ‘info’: u’用户未激活’}
else:
data = {‘code’: ‘-4’, ‘info’: u’用户名或密码错误’}
else:
data = {‘code’: ‘-6’, ‘info’: u’验证码错误’}

登出操作如下:

from django.contrib.auth import authenticate, login, logout

def logout_system(request):
“”"
退出登录
:param request:
:return:
“”"
logout(request)
return HttpResponseRedirect(’/’)

0x04. login_required装饰器

通过该装饰器能够使视图函数首先判断用户是否登录,如果未登录会跳到默认在settings.py设置的LOGIN_URL参数对应的url,如:LOGIN_URL = '/'。使用方法如下所示:

from django.contrib.auth.decorators import login_required

@login_required
def user_index(request):
“”"
用户管理首页
:param request:
:return:
“”"
if request.method == “GET”:

用户视图实现

0x05. 用户组及权限分配

组对象包含的字段只有name,但是外键了几张表,能够与user、permissions,产生多对多的关系,我在自定义权限实现中,采用的是权限写死的方法,添加用户组权限。

创建组的函数采用Group.objects.create(name=xxx),就能实现了。当然也跟创建用户一样,需要先判断是否组名已经存在。

创建好组名后,下一步就需要为每个组分配权限了,从前端提交过来的权限列表,然后后端采用groups.permissions.add(permission)的方式依次将权限添加进组。

添加完组权限后,最后一步是将组名添加进用户属性,区分用户属于哪个组。

具体实现代码如下:

# 创建组
try:Group.objects.get(name=role_name)data = {'code': -7, 'info': u'组名已存在'}
except Group.DoesNotExist:groups = Group.objects.create(name=role_name)if log_manage == 'true':permission = Permission.objects.get(codename='access_log')groups.permissions.add(permission)if role_manage == 'true':permission = Permission.objects.get(codename='access_role_manage')groups.permissions.add(permission)if user_manage == 'true':permission = Permission.objects.get(codename='access_user_manage')groups.permissions.add(permission)if get_users is not None:for user in get_users:# 每个user添加组属性db_user = get_object_or_404(User, username=user)db_user.groups.add(groups)data = {'code': 1, 'info': u'添加成功'}return HttpResponse(json.dumps(data))

0x06. 权限模型及权限控制

在上一点中用到的Permission.objects.get(codename='access_user_manage')是通过权限模型创建,需要在models中创建一个权限类,然后在meta中进行定义codename。

class AccessControl(models.Model):"""自定义权限控制"""class Meta:permissions = (('access_dashboard', u'控制面板'),('access_log', u'日志管理'),('access_role_manage', u'角色管理'),('access_user_manage', u'用户管理'),)

运行后,会自动在数据库中创建相应的表,并且插入数据。

在创建好权限之后,下一步就是在各个视图中插入权限控制代码了。permission_required(),参数为当前应用名.codename。这样就能控制用户访问,如果用户非法访问则会清空session退出登录。

@permission_required('webcenter.access_role_manage')
@login_required
def role_index(request):"""角色管理首页:param request::return:"""

同时在前端模板页面中也需要进行权限控制,前端要获取request对象的话,后端返回就需要使用render函数,render(request,xxx,xxx),具体代码就如下:

{% if request.user.is_superuser or 'webcenter.access_user_manage' in request.user.get_group_permissions or 'webcenter.access_role_manage' in request.user.get_group_permissions or 'webcenter.access_log' in request.user.get_group_permissions %}
<li class="treeview"><a href="#" rel="external nofollow" rel="external nofollow" ><i class="fa fa-fw fa-skyatlas"></i><span>站点管理</span> <i class="fa fa-angle-left pull-right"></i></a><ul class="treeview-menu">{% if request.user.is_superuser or 'webcenter.access_log' in request.user.get_group_permissions %}<li><a href="#" rel="external nofollow" rel="external nofollow" id="log_view">日志管理</a></li>{% endif %}{% if request.user.is_superuser or 'webcenter.access_role_manage' in request.user.get_group_permissions %}<li><a href="/role/index/" rel="external nofollow" >角色管理</a></li>{% endif %}{% if request.user.is_superuser or 'webcenter.access_user_manage' in request.user.get_group_permissions %}<li><a href="/user/index/" rel="external nofollow" >用户管理</a></li>{% endif %}
</ul>
</li>
{% endif %}

以上这篇django认证系统实现自定义权限管理的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

                    <p><p></td></tr></table>

原文地址是:http://www.piaodoo.com/thread-13741-1-7.html

django认证系统实现自定义权限管理的方法 - python相关推荐

  1. django 1.8 官方文档翻译:使用Django认证系统

    使用Django认证系统 这篇文档解释默认配置下Django认证系统的使用.这些配置已经逐步可以满足大部分常见项目对的需要,可以处理范围非常广泛的任务,且具有一套细致的密码和权限实现.对于需要与默认配 ...

  2. django 1.8 官方文档翻译:13-1-2 使用Django认证系统

    使用Django认证系统 这篇文档解释默认配置下Django认证系统的使用.这些配置已经逐步可以满足大部分常见项目对的需要,可以处理范围非常广泛的任务,且具有一套细致的密码和权限实现.对于需要与默认配 ...

  3. windows7系统电脑管理员权限的更改方法

    我们在使用win7系统的时候,有时候会发现自己的账户因为没有管理员权限从而无法更改某些设置或者打开一些文件,非常不方便,因此我们可以通过下面的方法让自己获得管理员权限,下面就一起来看一下windows ...

  4. win10系统获取管理员权限的设置方法一览

    在win10系统中有很多深度技术小伙伴都可能遇到过在安装某些软件,或者运行某些程序时,往往会提示需要运行管理员权限,不然软件无法运行的问题,win10系统虽然已经发布了五年,但是也有很多小伙伴没有更新 ...

  5. php 位运算与权限,PHP巧妙利用位运算实现网站权限管理的方法

    首先我们先定义4个常量来设定四种权限: ===================================== define(ADD,1);//增加数据库记录的权限 define(UPD,2);/ ...

  6. mysql创建函数的权限_MySQL创建用户和权限管理的方法

    一.如何创建用户和密码 1.进入到mysql数据库下 mysql> use mysql Database changed 2.对新用户增删改 1.创建用户 # 指定ip:192.118.1.1的 ...

  7. linux系统用户没有权限修改,Linux系统用户和权限管理

    一.用户 Linux系统上用户分类为两类:分为管理员用户和普通用户:普通用户又分为两类:系统用户和普通用户.在1.root和普通用户:系统用户:仅用于运行服务程序,登录用户:系统资源的正常使用者. 用 ...

  8. Linux系统中的权限管理

    一.权限查看与读取 1.权限管理 ls -l file ##文件 ls -ld dir ##目录权限查看 matadata 文件原数据 2.权限的读取 文件/目录权限信息 二.普通权限的类型及作用 1 ...

  9. android6.0 悬浮窗权限,Android6.0系统悬浮窗权限的问题解决方法

    转自:http://blog.csdn.net/tangmanong/article/details/53114758 Android的窗口体系中,WindowManager占有非常重要的地位,平时我 ...

最新文章

  1. pku 3422 Kaka's Matrix Travels 最大费用最大流
  2. Css布局系列-综合应用
  3. 科大讯飞AIUI(1)
  4. .net Forms身份验证不能用在应用的分布式部署中吗?
  5. hdu 4352 XHXJ's LIS
  6. python多态_Python面向对象教程之多态
  7. Versions maven plugin 修改版本
  8. mysql数据库设计中的14个技巧
  9. “约见”面试官系列之常见面试题之第六十四篇之call和apply区别(建议收藏)
  10. golang 生成随机数
  11. 超简单利用xposed框架破解钉钉打卡
  12. mysql mysqldump触发器备份_MySQL常用的备份工具之mysqldump
  13. php 获取照片信息,PHP读取照片信息
  14. FPGA平台开发基础
  15. vue 父组件重新加载子组件
  16. java将字符串内容转换为字节数组
  17. STM32开发方式及基本介绍
  18. Android Hanlder的理解
  19. html鼠标移动距离,简单的鼠标移动元素近大远小效果
  20. 如何在Ubuntu 14.04上使用NSD——一套仅权威DNS服务器

热门文章

  1. HTML页面防js缓存
  2. 模式识别学习笔记(7)——期望最大法(EM)
  3. 定时任务框架Quartz-(一)Quartz入门与Demo搭建
  4. 速戳,用户管理体系的搭建全攻略
  5. 软件开发过程中提升用户体验的途径[自己整理了下]
  6. 算法面试不懂这6大数据结构知识一定挂!(附力扣LeetCode真题讲解)
  7. SHOPEX快递物流单号查询插件
  8. 摄像头视频网关平台源码
  9. 提取DVD光盘(或镜像)音乐曲目方法
  10. 常见标准波导和法兰尺寸