• django 权限设置


    关于权限:

    首先明确权限是为了限制其他访问的url

    通过在models使之关联的表再通过关联表的权限来permissions的url 来检测url的访问

    一.

    需要三个类五张表

     1 from django.db import models
     2 
     3 # Create your models here.
     4 class User(models.Model):
     5 
     6     name=models.CharField(max_length=32)
     7     roles=models.ManyToManyField("Role")
     8 
     9     def __str__(self):
    10         return self.name
    11 
    12 class Role(models.Model):
    13 
    14     title=models.CharField(max_length=32)
    15     permissions=models.ManyToManyField("Permission")
    16 
    17     def __str__(self):
    18         return self.title
    19 
    20 
    21 class Permission(models.Model):
    22 
    23     title = models.CharField(max_length=32)
    24     url = models.CharField(max_length=32)
    25     is_menu = models.BooleanField(default=False)
    26     icon=models.CharField(max_length=32,null=True,blank=True)
    27 
    28     def __str__(self):
    29         return self.title
    models

    二.

    再通过admin来创建表的数据

    注意的是,为了方便显示各字段,可以创建类引用ModelAdmin来进行修饰

     1 from django.contrib import admin
     2 
     3 from app01.models import User,Role,Permission
     4 
     5 # Register your models here.
     6 admin.site.register(User)
     7 class RoleConfig(admin.ModelAdmin):
     8     list_display = ["title"]
     9 
    10 admin.site.register(Role,RoleConfig)
    11 
    12 class PermissionConfig(admin.ModelAdmin):
    13     list_display = ["title","pk","url","is_menu","icon"]
    14 # list_editable = ['url', 'is_menu', 'icon']
    15 
    16 admin.site.register(Permission,PermissionConfig)
    admin

    三.

    创建好数据库后,需要在login上进行

    验证登录

    保存用户登录的状态信息写入session中(确认在登录)

    查询当前登录人的权限列表

    将权限列表写入session中

     1 def login(request):
     2 
     3     if request.method=="POST":
     4         # 认证
     5 
     6         user=request.POST.get("user")
     7 
     8         user=User.objects.filter(name=user).first()
     9         if user:
    10             # 登录成功
    11 
    12             # 保存登录用户状态信息
    13 
    14             request.session["user_id"]=user.pk
    15 
    16             # 查询当前登录人的所有权限列表
    17             # 查看当前登录人的所有角色
    18             # ret=Role.objects.filter(user=user)
    19 
    20             permissions=Role.objects.filter(user=user).values("permissions__url").distinct()
    21             print(permissions)
    22 
    23             permission_list=[]
    24             for item in permissions:
    25                 permission_list.append(item["permissions__url"])
    26 
    27             # 将当前登录人的权限列表注入session中
    28             request.session["permission_list"]=permission_list
    29 
    30             return HttpResponse("登录成功")
    31     else:
    32         val="HAPPY"
    33         n=12
    34 
    35 
    36         return render(request,'login.html',locals())
    login录入session权限

    四.

    通过中间件的形式来验证用户的使用权限

    设置白名单

    检验是否登录

    校验权限

     1 from django.utils.deprecation import MiddlewareMixin
     2 from django.shortcuts import HttpResponse,redirect
     3 import re
     4 
     5 
     6 class PermissionMiddleWare(MiddlewareMixin):
     7 
     8     def process_request(self,request):
     9         print(1)
    10         print("permission_list",request.session.get("permission_list"))
    11         current_path = request.path
    12 
    13         # 设置白名单放行
    14         for reg in  ["/login/","/admin/*"]:
    15             ret=re.search(reg,current_path)
    16             if ret:
    17                 return None
    18         # /customers/edit/1
    19 
    20         # 校验是否登录
    21 
    22         user_id=request.session.get("user_id")
    23         print("user_id",user_id)
    24         if not user_id:
    25             return redirect("/login/")
    26 
    27         # 校验权限
    28 
    29 
    30         permission_list=request.session.get("permission_list")
    31 
    32         for reg in permission_list:
    33              reg="^%s$"%reg
    34              ret=re.search(reg,current_path)
    35              if ret:
    36                  return None
    37 
    38         return HttpResponse("无访问权限!")
    中间件检验权限

    这样初始的权限就完成了

  • 相关阅读:
    关于EventEmitter的用法
    nodejs中异常错误的处理方式
    nodejs中使用RabbitMq消息中心系统的方式
    webpack中alias别名配置
    webpack中字体配置,可以引入bootstrap
    安装node-sass提示没有vendor目录的解决办法
    Object.assign方法复制或合并对象
    ZeroClipboard跨浏览器复制粘贴
    用extract-text-webpack-plugin提取出来的css文件中背景图片url的不正确的问题
    python抽取指定url页面的title方法
  • 原文地址:https://www.cnblogs.com/zhangqing979797/p/9962357.html
Copyright © 2020-2023  润新知