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 相关文章推荐
Python中装饰器的一个妙用
Feb 08 Python
浅谈Python中重载isinstance继承关系的问题
May 04 Python
python实现电脑自动关机
Jun 20 Python
python数据批量写入ScrolledText的优化方法
Oct 11 Python
python3.x实现base64加密和解密
Mar 28 Python
python的sorted用法详解
Jun 25 Python
Python及Pycharm安装方法图文教程
Aug 05 Python
Python 根据数据模板创建shapefile的实现
Nov 26 Python
Pytorch Tensor 输出为txt和mat格式方式
Jan 03 Python
Python 解决火狐浏览器不弹出下载框直接下载的问题
Mar 09 Python
PyCharm2020.1.2社区版安装,配置及使用教程详解(Windows)
Aug 07 Python
python 绘制国旗的示例
Sep 27 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
PHP的历史和优缺点
2006/10/09 PHP
PHP base64+gzinflate压缩编码和解码代码
2008/10/03 PHP
thinkphp3查询mssql数据库乱码解决方法分享
2014/02/11 PHP
2个Codeigniter文件批量上传控制器写法例子
2014/07/25 PHP
php查询mysql数据库并将结果保存到数组的方法
2015/03/18 PHP
PHP入门教程之图像处理技巧分析
2016/09/11 PHP
PHP 获取指定地区的天气实例代码
2017/02/08 PHP
使用Javascript和DOM Interfaces来处理HTML
2006/10/09 Javascript
使javascript也能包含文件
2006/10/26 Javascript
JQuery 表格操作(交替显示、拖动表格行、选择行等)
2009/07/29 Javascript
JS中Iframe之间传值的方法
2013/03/11 Javascript
使用javascript创建快捷方式的简单实例
2013/08/09 Javascript
indexOf 和 lastIndexOf 使用示例介绍
2014/09/02 Javascript
提升PHP安全:8个必须修改的PHP默认配置
2014/11/17 Javascript
transport.js和jquery冲突问题的解决方法
2015/02/10 Javascript
jquery选择器简述
2015/08/31 Javascript
信息页文内画中画广告js实现代码(文中加载广告方式)
2016/01/03 Javascript
Webpack打包慢问题的完美解决方法
2017/03/16 Javascript
layer弹出的iframe层在执行完毕后关闭当前弹出层的方法
2018/08/17 Javascript
node.js的http.createServer过程深入解析
2019/06/06 Javascript
[02:51]DOTA2英雄基础教程 艾欧
2014/01/13 DOTA
Python中解析JSON并同时进行自定义编码处理实例
2015/02/08 Python
对python中的try、except、finally 执行顺序详解
2019/02/18 Python
Pytorch使用MNIST数据集实现CGAN和生成指定的数字方式
2020/01/10 Python
利用keras加载训练好的.H5文件,并实现预测图片
2020/01/24 Python
Python3自定义json逐层解析器代码
2020/05/11 Python
python实现图像外边界跟踪操作
2020/07/13 Python
html5中canvas学习笔记1-画板的尺寸与实际显示尺寸
2013/01/06 HTML / CSS
Linux操作面试题
2012/05/16 面试题
国外软件测试工程师面试题
2016/12/09 面试题
动物学专业毕业生求职信
2013/10/11 职场文书
2014年国庆节活动总结
2014/08/26 职场文书
公司奖励通知
2015/04/21 职场文书
2015最新婚礼司仪主持词
2015/06/30 职场文书
Python字典的基础操作
2021/11/01 Python
中国古风插画师排行榜:夏达第一,第三是阴阳师姑获鸟皮肤创作者
2022/03/18 国漫