侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

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

框架(架构)  /  管理员 发布于 7年前   194

示意图:

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 中,建立 模型: (这一步很重要!!!)

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

from django.db import modelsclass 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 那一列,很重要!!我们后面添加权限要用到的!!)

后端pythonCviews视图:

from django.contrib.auth.decorators import login_required, permission_requiredfrom django.contrib.auth.models import Userfrom django.views.decorators.http import require_http_methodsfrom django.http import HttpResponsefrom django.shortcuts import renderfrom 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)

后端pythonCmodels视图:

from django.contrib.auth.models import Userfrom django.contrib.auth import authenticatefrom django.db.utils import IntegrityErrorfrom . 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_requiredfrom django.views.decorators.http import require_http_methodsfrom 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, includeurlpatterns = [  url(r'^', include('slg.urls.slg.error')),           # 错误页面 相关路由]
'''子路由,这里进入具体的html页面'''from django.conf.urls import urlfrom slg.views.slg import errorurlpatterns = [  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="https:/article/{% 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_requiredfrom django.contrib.auth.models import Userfrom django.views.decorators.http import require_http_methodsfrom 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)

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


  • 上一条:
    Django中在xadmin中集成DjangoUeditor过程详解
    下一条:
    Django 创建/删除用户的示例代码
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • Filament v3.1版本发布(0个评论)
    • docker + gitea搭建一个git服务器流程步骤(0个评论)
    • websocket的三种架构方式使用优缺点浅析(0个评论)
    • ubuntu20.4系统中宿主机安装nginx服务,docker容器中安装php8.2实现运行laravel10框架网站(0个评论)
    • phpstudy_pro(小皮面板)中安装最新php8.2.9版本流程步骤(0个评论)
    • 近期文章
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2018-05
    • 2020-02
    • 2020-03
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-08
    • 2020-11
    • 2021-03
    • 2021-09
    • 2021-10
    • 2021-11
    • 2022-01
    • 2022-02
    • 2022-03
    • 2022-08
    • 2023-08
    • 2023-10
    • 2023-12
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客