基于Django框架实现前后端分离(五)

用户注册

Django有它自己的注册、登录方法,但是它的权限管理只适用于APP层面的管理,即如果给一个APP应用写的权限那么该APP下面所有的URL都有写的权限,很明显不够灵活,故这里登录注册权限管理全部使用中间件自己实现,
用户注册可以使用命令行创建超级用户,也可以使用User模型创建。
命令行创建用户:

python manage.py createsuperuser

当然也可以为已有用户修改密码:

python manage.py changepassword 用户名

也可以用模型创建:

from django.contrib.auth.models import User
user = User.objects.create_user(account, email, password)
user.is_active = True
user.save()

用户登录

用户登录,验证可以使用authenticate实现:

import time
from rest_framework.views import APIView
from django.http import JsonResponse
from django.contrib.auth import authenticate
class Login(APIView):
	...
	def post(self, request):
	    obj = request.data
        username = obj['username']
        password = obj['password']
        if username is None or password is None:
        	return JsonResponse({'code': 500, 'message': '请求参数错误'})
        is_login = authenticate(request,username=username,
        						password=password)
        if is_login is None:
            return JsonResponse({'code': 500, 'message': '账号或密码错误'})
        # 给admin_dict用户赋予一个特殊权限,该权限可以做某些其他用户不能做的事
        if username=='admin_dict':
            role='admin'
            request.session['role'] = username
        else:
            role=None
            request.session['role'] = ''
        # 将登录信息保存在session中
        request.session['is_login'] = 'true'
        request.session['username'] = username
        # 登录过期时间8小时
        request.session['expirationTime'] = time.time() + 60 * 60 * 8
        # 这里没有使用token验证
        return JsonResponse(
            {
                'status': 200,
                'msg': '登录成功',
                'result': {'token': '','role':role},
                # 'data': {'token': token}
            }, json_dumps_params={'ensure_ascii': False}
        )

用户权限管理

用户权限管理需要使用中间件,中间件的介绍与使用可以参考:中间件的使用
使用的是rbac模型:
创建Rbac模型中间件:

class RbacMiddleware(MiddlewareMixin):

    def process_request(self,request):
        # 1. 获取当前请求的URL request.path_info
        # 2. 获取Session中保存当前用户的权限
        # request.session.get("permission_url_list')
        current_url = request.path_info
        for url in settings.VALID_URL:
            if re.match(url,current_url):
                return None
        # content_type = ContentType.objects.get_for_model(TDictAll)
        username = request.session.get('username')
        if request.session.get('role'):
            role = request.session.get('role')
        else:
            role = ''
#        print(current_url,username)
		# 验证该用户是否有特殊权限,如果有直接通过,如果没有,看URL有没有禁用
		# 当然也可以验证用户是否拥有URL的操作权限,不过需要创建一个用户权限模型,专门验证
        if username==role:
            pass
        else:
        	# forbidden_list为黑名单,该URL没有特殊权限不可使用。可以在setting中设置。
            if current_url in forbidden_list:
                result = {"status": 600, "msg": '无权限'}
                return JsonResponse(result,
                                    json_dumps_params={'ensure_ascii': False})
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值