当前位置:   article > 正文

Django权限管理rbac基于中间件校验简单实现_基于django中间件实现网站的权限校验

基于django中间件实现网站的权限校验

完整代码:

https://github.com/leemamas/rbac.git

 

1.pycharm创建django项目

2.app下models.py

  1. from django.db import models
  2. #用户
  3. class User(models.Model):
  4. name = models.CharField(max_length=32)
  5. pwd = models.CharField(max_length=32)
  6. roles = models.ManyToManyField(to="Role")
  7. def __str__(self):
  8. return self.name
  9. #角色
  10. class Role(models.Model):
  11. title = models.CharField(max_length=32)
  12. permissions = models.ManyToManyField(to="Permission")
  13. def __str__(self):
  14. return self.title
  15. #权限
  16. class Permission(models.Model):
  17. title = models.CharField(max_length=32)
  18. url = models.CharField(max_length=32)
  19. def __str__(self):
  20. return self.title

3.manege.py-->Tools-->run manage.py Task

执行2个命令,建表

  1. makemigrations
  2. migrate

4.在app下admin.py下注册

  1. from django.contrib import admin
  2. from .models import *
  3. admin.site.register(User)
  4. admin.site.register(Role)
  5. admin.site.register(Permission)

5.在步骤3的命令下执行创建超级用户

createsuperadmin

6.根项目urls.py

  1. from django.contrib import admin
  2. from django.urls import path,re_path
  3. from rbac.views import *
  4. urlpatterns = [
  5. path('admin/', admin.site.urls),
  6. path('login/', login),
  7. path('users/', users),
  8. path('user/add/', user_add),
  9. re_path('user/edit/(\d+)/', user_edit),
  10. re_path('user/delete/(\d+)/', user_delete),
  11. path('roles/', roles),
  12. path('role/add/', role_add),
  13. ]

7.模板templates下创建login.html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Login</title>
  6. </head>
  7. <body>
  8. <h3>Lgoin</h3>
  9. <form action="" method="post">
  10. {% csrf_token %}
  11. user:<input type="text" name="user" id="user">
  12. pwd:<input type="password" name="pwd" id="pwd">
  13. <input type="submit" value="post">{{ msg }}
  14. </form>
  15. </body>
  16. </html>

8.app下的views.py

  1. from django.http import HttpResponse
  2. from django.shortcuts import render
  3. from .models import *
  4. import re
  5. from rbac.service.permission import *
  6. def login(request):
  7. if request.method == 'POST':
  8. user = request.POST.get('user')
  9. pwd = request.POST.get('pwd')
  10. user = User.objects.filter(name=user, pwd=pwd).first()
  11. if user:
  12. request.session['user_id']=user.pk
  13. # permissions=user.roles.all().values('permissions__url').distinct()
  14. #
  15. # permissionsList=[]
  16. # for permission in permissions:
  17. # permissionsList.append(permission['permissions__url'])
  18. #
  19. #
  20. # request.session['permissionsList']=permissionsList
  21. initial_session(request,user)
  22. return HttpResponse('login success!')
  23. else:
  24. msg='error!'
  25. return render(request, 'login.html', locals())
  26. def users(request):
  27. return HttpResponse('user view!')
  28. def user_add(request):
  29. return HttpResponse('user add!')
  30. def user_edit(request,id):
  31. permissionsList = request.session['permissionsList']
  32. current_path = request.path_info
  33. flag=False
  34. for permission in permissionsList:
  35. permission='^%s$'%permission
  36. ret=re.match(permission,current_path)
  37. if ret:
  38. flag=True
  39. break
  40. if flag:
  41. print('have permission!')
  42. return HttpResponse('user edit!edit:{}'.format(id))
  43. return HttpResponse('not permission!')
  44. def user_delete(request,id):
  45. print('delete',id)
  46. return HttpResponse('user delete!')
  47. def roles(request):
  48. return HttpResponse('roles views!')
  49. def role_add(request):
  50. return HttpResponse('role add!')

9.app下,创建包文件夹

创建rbac.py,permission.py

  1. from django.utils.deprecation import MiddlewareMixin
  2. import re
  3. from django.shortcuts import HttpResponse,redirect
  4. class ValidPermission(MiddlewareMixin):
  5. def process_request(self, request):
  6. current_path = request.path_info
  7. #白名单
  8. whiteList = ['/login/', '/admin/.*']
  9. for url in whiteList:
  10. ret = re.match(url, current_path)
  11. if ret:
  12. return None
  13. #检验登录
  14. user_id=request.session.get('user_id')
  15. if not user_id:
  16. return redirect('/login/')
  17. permissionsList = request.session.get('permissionsList', [])
  18. flag = False
  19. for permission in permissionsList:
  20. permission = '^%s$' % permission
  21. ret = re.match(permission, current_path)
  22. if ret:
  23. flag = True
  24. break
  25. if not flag:
  26. return HttpResponse('没有权限!')
  27. return None
  1. def initial_session(request,user):
  2. permissions = user.roles.all().values('permissions__url').distinct()
  3. permissionsList = []
  4. for permission in permissions:
  5. permissionsList.append(permission['permissions__url'])
  6. request.session['permissionsList'] = permissionsList

10.根settings.py,注册中间件

  1. MIDDLEWARE = [
  2. 'django.middleware.security.SecurityMiddleware',
  3. 'django.contrib.sessions.middleware.SessionMiddleware',
  4. 'django.middleware.common.CommonMiddleware',
  5. 'django.middleware.csrf.CsrfViewMiddleware',
  6. 'django.contrib.auth.middleware.AuthenticationMiddleware',
  7. 'django.contrib.messages.middleware.MessageMiddleware',
  8. 'django.middleware.clickjacking.XFrameOptionsMiddleware',
  9. 'rbac.service.rbac.ValidPermission',
  10. ]

11.数据库自行添加数据测试!

也可以到github下载数据库文件

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/71742
推荐阅读
相关标签
  

闽ICP备14008679号