1515import logging
1616
1717from django .urls import resolve
18- # from django.http import HttpRequest
1918from django .utils .deprecation import MiddlewareMixin
19+ from django .http import JsonResponse
2020
2121from rest_framework .reverse import reverse
2222from rest_framework_jwt .utils import jwt_decode_handler
2323
2424from jwt import DecodeError
2525
2626from db_models .models import (
27- OperateLog , UserLoginLog
27+ OperateLog , UserLoginLog , UserProfile
2828)
2929from django .utils import timezone
3030from omp_server .settings import INTERFACE_KINDS
3131
3232logger = logging .getLogger ("server" )
3333
3434
35+ def get_username_of_token (token ):
36+ """通过jwt token 解析username"""
37+ _token_user = jwt_decode_handler (token )
38+ _username = _token_user .get ("username" )
39+ return _username
40+
41+
42+ USER_TO_ROLE_EN_DICT = {
43+ "superuser" : "普通管理员" ,
44+ "readonlyuser" : "只读用户"
45+ }
46+
47+
3548class OperationLogMiddleware (MiddlewareMixin ):
3649 """用于处理操作日志的中间件"""
3750
@@ -57,34 +70,34 @@ def process_response(self, request, response):
5770 _ip , _ = ipware .get_client_ip (request )
5871 try :
5972 token = request .COOKIES .get ("jwtToken" , "toke" )
60- _token_user = jwt_decode_handler (token )
61- _username = _token_user .get ("username" )
73+ _username = get_username_of_token (token )
6274 except DecodeError :
6375 _username = "匿名用户"
6476 if _url == reverse ("login" ):
6577 _desc = "用户登录"
78+ request_result = ""
79+ _token = None
6680 if "token" in response .data :
6781 request_result = "登录成功"
82+ _token = response .data .get ("token" , "" )
83+ _username = get_username_of_token (_token )
6884 else :
69- request_result = "登录失败"
70- # TODO 角色管理
71- _username = "admin" if _username == "匿名用户" else _username
85+ return response
86+ _token_user = UserProfile .objects .filter (username = _username ).first ()
7287 data = {
7388 'username' : _username ,
7489 'login_time' : timezone .now (),
75- 'role' : "超级管理员用户" ,
90+ 'role' : USER_TO_ROLE_EN_DICT . get ( _token_user . role . lower (), "" ) ,
7691 'ip' : _ip ,
7792 'request_result' : request_result
7893 }
7994 UserLoginLog .objects .create (** data )
80- # OperateLog(
81- # username=_username, request_ip=_ip, request_method=_method,
82- # request_url=_url, description=_desc,
83- # response_code=response_code, request_result=request_result
84- # ).save()
8595 else :
8696 # 读取已封装响应数据
87- res_data = json .loads (response .rendered_content )
97+ try :
98+ res_data = json .loads (response .rendered_content )
99+ except Exception as e :
100+ return response
88101 method_dc = {
89102 'put' : '修改' ,
90103 'get' : '查看' ,
@@ -103,3 +116,29 @@ def process_response(self, request, response):
103116 request_result = res_data .get ("message" , "" )
104117 ).save ()
105118 return response
119+
120+
121+ class RoleAuthenticationMiddleware (MiddlewareMixin ):
122+ """用户角色访问限制"""
123+
124+ def process_view (self , request , func , * args , ** kwargs ):
125+ _method = request .method .lower ()
126+ if _method == "get" :
127+ return None
128+ _url = request .path
129+ if _url .startswith ("/proxy/v1/grafana" ) or _url .startswith ("/api/login/" ):
130+ return None
131+ try :
132+ token = request .COOKIES .get ("jwtToken" , "toke" )
133+ _token_user = jwt_decode_handler (token )
134+ _username = _token_user .get ("username" )
135+ except DecodeError :
136+ _username = "匿名用户"
137+ _token_user = UserProfile .objects .filter (username = _username ).first ()
138+ if not _token_user :
139+ # 非页面访问omp接口,放行
140+ return None
141+ if _token_user .role .lower () == "superuser" :
142+ return None
143+ logger .error (f"{ _token_user } prohibited this action" )
144+ return JsonResponse ({"code" : 1 , "data" : None , "message" : f"该{ _token_user .username } 用户无权限" })
0 commit comments