Django权限管理rbac基于中间件校验简单实现

完整代码:

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

 

1.pycharm创建django项目

2.app下models.py

from django.db import models

#用户
class User(models.Model):
    name = models.CharField(max_length=32)
    pwd = models.CharField(max_length=32)
    roles = models.ManyToManyField(to="Role")

    def __str__(self):
        return self.name

#角色
class Role(models.Model):
    title = models.CharField(max_length=32)
    permissions = models.ManyToManyField(to="Permission")

    def __str__(self):
        return self.title

#权限
class Permission(models.Model):
    title = models.CharField(max_length=32)
    url = models.CharField(max_length=32)

    def __str__(self):
        return self.title

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

执行2个命令,建表

makemigrations
migrate

4.在app下admin.py下注册

from django.contrib import admin

from .models import *

admin.site.register(User)
admin.site.register(Role)
admin.site.register(Permission)

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

createsuperadmin

6.根项目urls.py


from django.contrib import admin
from django.urls import path,re_path
from rbac.views import *

urlpatterns = [
    path('admin/', admin.site.urls),
    path('login/', login),
    path('users/', users),
    path('user/add/', user_add),
    re_path('user/edit/(\d+)/', user_edit),
    re_path('user/delete/(\d+)/', user_delete),
    path('roles/', roles),
    path('role/add/', role_add),
]

7.模板templates下创建login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Login</title>
</head>
<body>
<h3>Lgoin</h3>
<form action="" method="post">
    {% csrf_token %}
    user:<input type="text" name="user" id="user">
    pwd:<input type="password" name="pwd" id="pwd">
    <input type="submit" value="post">{{ msg }}
</form>

</body>
</html>

8.app下的views.py

from django.http import HttpResponse
from django.shortcuts import render
from .models import *
import re
from rbac.service.permission import *


def login(request):

    if request.method == 'POST':

        user = request.POST.get('user')
        pwd = request.POST.get('pwd')

        user = User.objects.filter(name=user, pwd=pwd).first()
        if user:
            request.session['user_id']=user.pk
            # permissions=user.roles.all().values('permissions__url').distinct()
            #
            # permissionsList=[]
            # for permission in permissions:
            #     permissionsList.append(permission['permissions__url'])
            #
            #
            # request.session['permissionsList']=permissionsList


            initial_session(request,user)

            return HttpResponse('login success!')
        else:
            msg='error!'

    return render(request, 'login.html', locals())


def users(request):
    return HttpResponse('user view!')

def user_add(request):
    return HttpResponse('user add!')

def user_edit(request,id):
    permissionsList = request.session['permissionsList']
    current_path = request.path_info

    flag=False
    for permission in permissionsList:
        permission='^%s$'%permission
        ret=re.match(permission,current_path)
        if ret:
            flag=True
            break

    if flag:
        print('have permission!')
        return HttpResponse('user edit!edit:{}'.format(id))

    return HttpResponse('not permission!')

def user_delete(request,id):
    print('delete',id)
    return HttpResponse('user delete!')


def roles(request):
    return HttpResponse('roles views!')


def role_add(request):
    return HttpResponse('role add!')

9.app下,创建包文件夹

创建rbac.py,permission.py

from django.utils.deprecation import MiddlewareMixin
import re
from django.shortcuts import HttpResponse,redirect


class ValidPermission(MiddlewareMixin):

    def process_request(self, request):

        current_path = request.path_info

        #白名单
        whiteList = ['/login/', '/admin/.*']

        for url in whiteList:
            ret = re.match(url, current_path)
            if ret:
                return None

        #检验登录
        user_id=request.session.get('user_id')
        if not user_id:
            return redirect('/login/')


        permissionsList = request.session.get('permissionsList', [])

        flag = False

        for permission in permissionsList:
            permission = '^%s$' % permission
            ret = re.match(permission, current_path)
            if ret:
                flag = True
                break
        if not flag:
            return HttpResponse('没有权限!')

        return None


def initial_session(request,user):
    permissions = user.roles.all().values('permissions__url').distinct()

    permissionsList = []
    for permission in permissions:
        permissionsList.append(permission['permissions__url'])

    request.session['permissionsList'] = permissionsList

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

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'rbac.service.rbac.ValidPermission',
]

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值