用户注册
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})