django 权限设置
关于权限:
首先明确权限是为了限制其他访问的url
通过在models使之关联的表再通过关联表的权限来permissions的url 来检测url的访问
一.
需要三个类五张表
from django.db import models # Create your models here.
class User(models.Model): name=models.CharField(max_length=32)
roles=models.ManyToManyField("Role") def __str__(self):
return self.name class Role(models.Model): title=models.CharField(max_length=32)
permissions=models.ManyToManyField("Permission") def __str__(self):
return self.title class Permission(models.Model): title = models.CharField(max_length=32)
url = models.CharField(max_length=32)
is_menu = models.BooleanField(default=False)
icon=models.CharField(max_length=32,null=True,blank=True) def __str__(self):
return self.title
models
二.
再通过admin来创建表的数据
注意的是,为了方便显示各字段,可以创建类引用ModelAdmin来进行修饰
from django.contrib import admin from app01.models import User,Role,Permission # Register your models here.
admin.site.register(User)
class RoleConfig(admin.ModelAdmin):
list_display = ["title"] admin.site.register(Role,RoleConfig) class PermissionConfig(admin.ModelAdmin):
list_display = ["title","pk","url","is_menu","icon"]
# list_editable = ['url', 'is_menu', 'icon'] admin.site.register(Permission,PermissionConfig)
admin
三.
创建好数据库后,需要在login上进行
验证登录
保存用户登录的状态信息写入session中(确认在登录)
查询当前登录人的权限列表
将权限列表写入session中
def login(request):
if request.method=="POST":
# 认证
user=request.POST.get("user")
user=User.objects.filter(name=user).first()
if user:
# 登录成功
# 保存登录用户状态信息
request.session["user_id"]=user.pk
# 查询当前登录人的所有权限列表
# 查看当前登录人的所有角色
# ret=Role.objects.filter(user=user)
permissions=Role.objects.filter(user=user).values("permissions__url").distinct()
print(permissions)
permission_list=[]
for item in permissions:
permission_list.append(item["permissions__url"])
# 将当前登录人的权限列表注入session中
request.session["permission_list"]=permission_list
return HttpResponse("登录成功")
else:
val="HAPPY"
n=12
return render(request,'login.html',locals())
login录入session权限
四.
通过中间件的形式来验证用户的使用权限
设置白名单
检验是否登录
校验权限
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse,redirect
import re class PermissionMiddleWare(MiddlewareMixin): def process_request(self,request):
print(1)
print("permission_list",request.session.get("permission_list"))
current_path = request.path # 设置白名单放行
for reg in ["/login/","/admin/*"]:
ret=re.search(reg,current_path)
if ret:
return None
# /customers/edit/1 # 校验是否登录 user_id=request.session.get("user_id")
print("user_id",user_id)
if not user_id:
return redirect("/login/") # 校验权限 permission_list=request.session.get("permission_list") for reg in permission_list:
reg="^%s$"%reg
ret=re.search(reg,current_path)
if ret:
return None return HttpResponse("无访问权限!")
中间件检验权限
这样初始的权限就完成了
django 权限设置的更多相关文章
- django 权限设置-菜单显示
问题:在用户登录后,如何只显示出用户权限的菜单呢?需要设置显示菜单权限 1.为了显示菜单,需要在models权限上添加is_menu(手动判断是否是查看)的icon(图标字符串) 在rbac中录入另一 ...
- django 权限设置-登录配置权限
1.首先需要一个判断用户是否拥有这个权限的name来区分在主页上是否显示标签 在permission中加入 name=models.CharField(max_length=32, verbose_n ...
- django 权限设置 左侧菜单点击显示,面包屑
1.左侧菜单点击显示 就是在点击的时候保留点击的功能 方法. 1.加入新的字段,pid来判断 class Permission(models.Model): """ 权限 ...
- [Python学习] Django 权限控制
本文为大家讲解 Django 框架里自带的权限模型,从理论到实战演练,带领大家了解 Django 里权限是怎么一回事. 一.主要内容 1.什么是权限管理? 2.Web 权限 3.Django 权限机制 ...
- django(权限、认证)系统——第三方组件实现Object级别权限控制
在我的系列blog<Django中内置的权限控制>中明确提及到,Django默认并没有提供对Object级别的权限控制,而只是在架构上留了口子.在这篇blog中,我们探讨一个简单流行的Dj ...
- django(权限、认证)系统—— 基于Authentication backends定制
在这篇文章中,我们进行最后关于DjangoPermission系统的探讨,来谈谈关于Permission系统后台接口和扩展后台接口的开发. Django实现的这套permission体系,在底层被抽象 ...
- django(权限、认证)系统—— Permissions和Group
接着上面的3篇讨论文章,我们阐述了Django中如何使用Authentication系统进行,用户的创建,登陆,登出,完成了用户的认证.接下来,我们要看另外一个议题,那就是Authorization授 ...
- django权限管理(Permission)
什么是权限管理 权限管理,一般指根据系统设置的安全规则或者安全策略,用户可以访问而且只能访问自 己被授权的资源 权限管理好比如钥匙,有了钥匙就能把门打开,但是权限设置是有级别之分的,假如这个 系统有多 ...
- django权限管理(一)
权限:权限就是一个包含正则的url. Rbac 权限管理: Role-Based Access Control,基于角色的访问控制.用户通过角色与权限进行关联,一个用户可以有多个角色,一个角色可以有多 ...
随机推荐
- nowcoder911L 最优子区间
题目链接 思路 用\(f(i,j)\)表示前i个元素,以i为右端点,j为左端点时的答案. 用个"区间修改,单点查询"的线段树维护出第二维.在从左往右枚举i的过程中.将\([lst_ ...
- 【Arch安装】
[Arch安装]不完整,凭记忆补充 1,制作安装介质(请跳转链接:https://www.archlinux.org/download/) 2,从UEFI模式启动后,按照官方WIKI向导操作(http ...
- TextView实现文字水平滚动效果
有时候我们使用TextView显示文本,只想把所有内容用一行显示出来,但是一行又显示不完,就需要让文本实现水平滚动的效果. 具体实现方法如下: 1,实现自定义TextView并实现isFocused( ...
- Java 并发系列之八:java 并发工具(4个)
1. CountDownLatch 2. CyclicBarrier 3. Semaphore 4. Exchanger 5. txt java 并发工具 通俗理解 CountDownLatch 等A ...
- go-gin-api 路由中间件 - 捕获异常
概述 首先同步下项目概况: 上篇文章分享了,路由中间件 - 日志记录,这篇文章咱们分享:路由中间件 - 捕获异常. 当系统发生异常时,提示 “系统异常,请联系管理员!”,并发送 panic 告警邮件. ...
- go-gin-api 路由中间件 - 签名验证(七)
概览 首先同步下项目概况: 上篇文章分享了,路由中间件 - Jaeger 链路追踪(实战篇),文章反响真是出乎意料, 「Go中国」 公众号也转发了,有很多朋友加我好友交流,直呼我大神,其实我哪是什么大 ...
- SpringBoot整合SpringDataJPA及在页面yaml中显示
SpringBoot整合SpringDataJPA及在页面yaml中显示 1:创建对应的数据表 2:添加依赖 3:配置数据源 1:创建对应的数据表 CREATE TABLE `user` ( `id` ...
- Nginx 变量参数
$args #请求中的参数值 $query_string #同 $args $arg_NAME #GET请求中NAME的值 $is_args #如果请求中有参数,值为"?",否则为 ...
- Java8 LocalDateTime和Date相互转换
很想要用Java的时间api,但有时候还是需要转换为Date. 二者的相互转换并不是一步到位那么简单,所以,还是需要记录一下转换的api Date to LocalDateTime Date toda ...
- 集合类源码(三)Collection之List(CopyOnWriteArrayList, Stack)
CopyOnWriteArrayList 功能 全名 public class CopyOnWriteArrayList<E> implements List<E>, Rand ...