Django 权限认证(根据不同的用户,设置不同的显示和访问权限)


Posted in Python onJuly 24, 2019

示意图:

Django 权限认证(根据不同的用户,设置不同的显示和访问权限)

html:(模态框等 html和js代码,参考:Django 创建/删除用户)

{# 权限管理 #}
  <div id="permissionManageDiv" style="margin-left: 10px; display: none;">
    <div>
      <h4 style="margin-top: 15px;">选择用户</h4>
      <hr style="margin-top: 5px;" />
      <select name="usernamePermission" id="usernamePermission" class="selectpicker" data-live-search="true">
        {% for user in users %}
          <option value="{{ user.username }}">{{ user.username }}</option>
        {% endfor %}
      </select>
      <hr />
    </div>

    <div>
      <h4 style="margin-top: 15px;">勾选权限</h4>
      <hr style="margin-top: 5px;" />
      <div style="margin-bottom: 10px;">
        <div class="input-group input-group-lg" style="float: left; margin-right: 10px;">
          <span class="input-group-addon">玩家管理</span>
          <span class="input-group-addon">
            <input type="checkbox" name="permissionList" value="0" />
          </span>
        </div>
        <div class="input-group input-group-lg" style="float: left; margin-right: 10px;">
          <span class="input-group-addon">联盟管理</span>
          <span class="input-group-addon">
            <input type="checkbox" name="permissionList" value="1" />
          </span>
        </div>
        <div class="input-group input-group-lg" style="float: left; margin-right: 10px;">
          <span class="input-group-addon">公告邮件</span>
          <span class="input-group-addon">
            <input type="checkbox" name="permissionList" value="2" />
          </span>
        </div>
        <div class="input-group input-group-lg" style="float: left; margin-right: 10px;">
          <span class="input-group-addon">订单系统</span>
          <span class="input-group-addon">
            <input type="checkbox" name="permissionList" value="3" />
          </span>
        </div>
        <div class="input-group input-group-lg" style="">
          <span class="input-group-addon">礼包奖励</span>
          <span class="input-group-addon">
            <input type="checkbox" name="permissionList" value="4" />
          </span>
        </div>
      </div>

      <div>
        <div class="input-group input-group-lg" style="float: left; margin-right: 10px;">
          <span class="input-group-addon">客服反馈</span>
          <span class="input-group-addon">
            <input type="checkbox" name="permissionList" value="5" />
          </span>
        </div>
        <div class="input-group input-group-lg" style="float: left; margin-right: 10px;">
          <span class="input-group-addon">玩家日志</span>
          <span class="input-group-addon">
            <input type="checkbox" name="permissionList" value="6" />
          </span>
        </div>
        <div class="input-group input-group-lg" style="float: left; margin-right: 10px;">
          <span class="input-group-addon">服务器管理</span>
          <span class="input-group-addon">
            <input type="checkbox" name="permissionList" value="7" />
          </span>
        </div>
        <div class="input-group input-group-lg">
          <span class="input-group-addon">管理员管理</span>
          <span class="input-group-addon">
            <input type="checkbox" name="permissionList" value="8" />
          </span>
        </div>
      </div>
    </div>
    <button type="button" id="changePermissionBtn" class="btn btn-default" style="width: 100px; margin-top: 15px;" data-toggle="modal" data-target="#alertTip" data-whatever="重置权限?" >提  交</button>
  </div>

js:

// 修改权限
function changePermission() {
  var permissionList = $('input[name="permissionList"]:checked');
  var permissions = '';
  $.each(permissionList, function (index, value, array) {
    if (index+1 == permissionList.length) {  // 最后一位,不加逗号
      permissions += permissionList[index].value;
    } else {
      permissions += permissionList[index].value + ', ';
    }
  });
  $.ajax({
    url: '/changePermission',
    type: 'POST',
    data: {
      username: $('#usernamePermission').val(),
      permissions: permissions
    },
    success: function (data, textStatus) {
      if (data == 1) {
        alert('修改成功!');
        window.location.href = 'index';

      } else if (data == -1) {
        alert('未知错误!');
      }
    },
    error: function (XMLHttpRequest, textStatus, errorThrown) {
      alert(errorThrown);
    }
  })
}

Django models 中,建立 模型: (这一步很重要!!!)

? 建立好后,记得用 makemigrations 和 migrate 同步一下!!

from django.db import models

class Permission(models.Model):
  class Meta:
    #权限信息,这里定义的权限的名字,后面是描述信息,描述信息是在django admin中显示权限用的
    permissions = (
      ('views_slg_users_tem', '查看玩家管理'),
      ('views_slg_alliance_tem', '查看联盟管理'),
      ('views_slg_mail_notice_tem', '查看公告邮件'),
      ('views_slg_order_tem', '查看订单系统'),
      ('views_slg_reward_tem', '查看礼包奖励'),
      ('views_slg_service_reply_tem', '查看客服反馈'),
      ('views_slg_user_log_tem', '查看玩家日志'),
      ('views_slg_server_tem', '查看服务器管理'),
      ('views_slg_manager_tem', '查看管理员管理'),
    )

建立好后,数据库表(auth_permission)类似于这样: (id 那一列,很重要!!我们后面添加权限要用到的!!)

Django 权限认证(根据不同的用户,设置不同的显示和访问权限)

后端python?views视图:

from django.contrib.auth.decorators import login_required, permission_required
from django.contrib.auth.models import User
from django.views.decorators.http import require_http_methods
from django.http import HttpResponse
from django.shortcuts import render
from slg.models.slg.slg_manager_tem import db_change_permission)

# 修改权限
@login_required(login_url='slg:login')
@require_http_methods(["POST"])
@permission_required('slg.views_slg_manager_tem', login_url='slg:get_permissionDenied')
def change_permission(request):
  permissionsList = [
            'views_slg_users_tem',
            'views_slg_mail_notice_tem',
            'views_slg_order_tem',
            'views_slg_reward_tem', 
            'views_slg_service_reply_tem',
            'views_slg_user_log_tem', 
            'views_slg_server_tem', 
            'views_slg_manager_tem'
            ]
  username = request.POST['username']
  permissions = request.POST['permissions'].split(', ')

  if permissions[0] != '':  # 不为空时
    for index, value in enumerate(permissions):
      permissions[index] = permissionsList[int(value)]  # 将 数字 替换为 上面数组中的 字符串
    print(permissions)
  else:
    permissions = []

  changeResult = db_change_permission(username, permissions)
  return HttpResponse(changeResult)

后端python?models视图:

from django.contrib.auth.models import User
from django.contrib.auth import authenticate
from django.db.utils import IntegrityError
from . import db_models as db

# 修改权限
def db_change_permission(username, permissions):
  try:
    user = User.objects.get(username=username)
    if permissions:
      pers = []
      for per in permissions:
        db_per = db.AuthPermission.objects.filter(codename=per).values('id')[0]['id']  # 只把 id 取出来
        pers.append(db_per)
      #print(pers)  # 形如: [147, 150, 152] 数字为 auth_permission 中的 id
      user.user_permissions = pers # 这里,只能 加 id,加 codename 是不行的!!!

    else:
      user.user_permissions.clear()
    User.objects.get(username=username)  # 刷新 缓存
    #print(user.get_all_permissions())

  except Exception:
    return -1
  else:
    return 1  # 修改成功

错误页面相关: (它是类似于:403, 404 等页面的汇总,也需要设置相关路由)

permissionDenied.html:

<!DOCTYPE html>
<html lang="en">
{% load staticfiles %}
<head>
  <meta charset="UTF-8">
  <title>403</title>
</head>
<body>
  <h1>403</h1>
  <h2>You don't have enought permissions to this action!</h2>
</body>
</html>

view视图:

from django.contrib.auth.decorators import login_required
from django.views.decorators.http import require_http_methods
from django.shortcuts import render

# GET 渲染 403页面
@login_required(login_url='slg:login')
@require_http_methods(["GET", "POST"])
def get_permissionDenied(request):
  return render(request, 'slg/permissionDenied.html')

url路由:

'''总路由,路由分发地'''
from django.conf.urls import url, include

urlpatterns = [
  url(r'^', include('slg.urls.slg.error')),           # 错误页面 相关路由
]
'''子路由,这里进入具体的html页面'''
from django.conf.urls import url
from slg.views.slg import error

urlpatterns = [
  url(r'^permissionDenied$', error.get_permissionDenied, name='get_permissionDenied'), # 403页面
]

正常页面的 权限设置:

base.html:(模板页面,所有页面都继承于此)

{% if 'slg.views_slg_users_tem' in perms %}   {# 判断 是否 有访问权限,没有的话,就不显示该菜单 #}
      <li role="presentation" class="main-menu" id="top_one">
        <a href="{% url 'slg:get_slg_users_tem' %}" rel="external nofollow" style="margin-left: 5px;"><span class="glyphicon glyphicon-fire"></span>玩家管理</a>
      </li>
    {% endif %}

其他 veiws视图 中的设置:

from django.contrib.auth.decorators import login_required, permission_required
from django.contrib.auth.models import User
from django.views.decorators.http import require_http_methods
from django.shortcuts import render

# GET 渲染页面 (其他的POST请求中,最好也加入 @permission_required 用来限制访问)
@login_required(login_url='slg:login')
@require_http_methods(["GET"])
@permission_required('slg.views_slg_users_tem', login_url='slg:get_permissionDenied') #权限装饰器
def get_users_tem(request):
  perms = User.get_all_permissions(request.user)  #获取 访问请求 用户的 所有权限
  context = {"perms": perms}
  return render(request, 'slg/slg_users_tem.html', context=context)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Cpy和Python的效率对比
Mar 20 Python
在Python的while循环中使用else以及循环嵌套的用法
Oct 14 Python
NumPy 基本切片和索引的具体使用方法
Apr 24 Python
python+openCV利用摄像头实现人员活动检测
Jun 22 Python
python 实现让字典的value 成为列表
Dec 16 Python
python 通过手机号识别出对应的微信性别(实例代码)
Dec 22 Python
TensorFlow命名空间和TensorBoard图节点实例
Jan 23 Python
详解python常用命令行选项与环境变量
Feb 20 Python
Java Spring项目国际化(i18n)详细方法与实例
Mar 20 Python
Python第三方库的几种安装方式(小结)
Apr 03 Python
python操作ini类型配置文件的实例教程
Oct 30 Python
一篇文章带你了解Python和Java的正则表达式对比
Sep 15 Python
Django 创建/删除用户的示例代码
Jul 24 #Python
python3.6+django2.0+mysql搭建网站过程详解
Jul 24 #Python
简单了解python 邮件模块的使用方法
Jul 24 #Python
python 根据字典的键值进行排序的方法
Jul 24 #Python
如何使用Flask-Migrate拓展数据库表结构
Jul 24 #Python
Python定时任务工具之APScheduler使用方式
Jul 24 #Python
Python实现一个带权无回置随机抽选函数的方法
Jul 24 #Python
You might like
第三节--定义一个类
2006/11/16 PHP
php+ajax实现无刷新的新闻留言系统
2020/12/21 PHP
PHP对XML内容进行修改和删除实例代码
2016/10/26 PHP
浅谈PHP封装CURL
2019/03/06 PHP
微信公众平台开发教程④ ThinkPHP框架下微信支付功能图文详解
2019/04/10 PHP
php查看一个变量的占用内存的实例代码
2020/03/29 PHP
js 数组操作代码集锦
2009/04/28 Javascript
JS中图片缓冲loading技术的实例代码
2013/08/29 Javascript
JS 使用for循环遍历子节点查找元素
2014/09/06 Javascript
JS实现仿中关村论坛评分后弹出提示效果的方法
2015/02/23 Javascript
JavaScript使用replace函数替换字符串的方法
2015/04/06 Javascript
浅析Javascript中bind()方法的使用与实现
2016/04/29 Javascript
微信小程序 配置文件详细介绍
2016/12/14 Javascript
Jquery与Bootstrap实现后台管理页面增删改查功能示例
2017/01/22 Javascript
理解javascript中的Function.prototype.bind的方法
2017/02/03 Javascript
javascript内存分配原理实例分析
2017/04/10 Javascript
angular使用bootstrap方法手动启动的实例代码
2017/07/18 Javascript
jQuery 实现倒计时天,时,分,秒功能
2018/07/31 jQuery
vue中引用swiper轮播插件的教程详解
2018/08/16 Javascript
JavaScript学习笔记之图片库案例分析
2019/01/08 Javascript
微信小程序实现3D轮播图效果(非swiper组件)
2019/09/21 Javascript
nodejs使用socket5进行代理请求的实现
2020/02/21 NodeJs
搭建vscode+vue环境的详细教程
2020/08/31 Javascript
微信小程序实现购物车功能
2020/11/18 Javascript
Python面向对象编程基础解析(二)
2017/10/26 Python
python 类对象和实例对象动态添加方法(分享)
2017/12/31 Python
python实现对指定字符串补足固定长度倍数截断输出的方法
2018/11/15 Python
python矩阵的转置和逆转实例
2018/12/12 Python
与Django结合利用模型对上传图片预测的实例详解
2019/08/07 Python
python中adb有什么功能
2020/06/07 Python
Python判断远程服务器上Excel文件是否被人打开的方法
2020/07/13 Python
35款精致的 CSS3 和 HTML5 网页模板 推荐
2012/08/03 HTML / CSS
Css3新特性应用之形状总结
2016/12/08 HTML / CSS
HTML5+WebSocket实现多文件同时上传的实例
2016/12/29 HTML / CSS
自我鉴定怎么写
2013/12/05 职场文书
安全检查与奖惩制度
2014/01/23 职场文书