Browse Source

项目认证系统和权限系统

yf_fyh 3 years ago
parent
commit
7754fee596

+ 0 - 1
apps/IOTCard/urls.py

@@ -2,7 +2,6 @@ from rest_framework import routers
 
 from . import views
 
-app_name = 'apps.IOTCard'
 
 router = routers.SimpleRouter()
 router.register('platsimview', views.PlatformIOTCardViewSet)

+ 1 - 0
apps/IOTCard/views.py

@@ -264,6 +264,7 @@ class PlatformIOTCardViewSet(viewsets.ModelViewSet):
         save_path = os.path.join(now_dir,"excel_folder",save_filename)
         df.to_excel(save_path,index=False,header=["设备ID","完整设备号(自行判断)","设备类型","是否需要充值","说明备注"])
         return Response(save_filename)
+        
     @action(methods=['post'], detail=False, url_path='xucun_card_filter', url_name='xucun_card_filter')
     def xucun_card_filter(self, request, *args, **kwargs):
         simtype = request.data.get("simtype")

+ 0 - 0
apps/PestAnalysis/__init__.py


+ 3 - 0
apps/PestAnalysis/admin.py

@@ -0,0 +1,3 @@
+from django.contrib import admin
+
+# Register your models here.

+ 5 - 0
apps/PestAnalysis/apps.py

@@ -0,0 +1,5 @@
+from django.apps import AppConfig
+
+
+class PestanalysisConfig(AppConfig):
+    name = 'apps.PestAnalysis'

+ 3 - 0
apps/PestAnalysis/models.py

@@ -0,0 +1,3 @@
+from django.db import models
+
+# Create your models here.

+ 3 - 0
apps/PestAnalysis/tests.py

@@ -0,0 +1,3 @@
+from django.test import TestCase
+
+# Create your tests here.

+ 9 - 0
apps/PestAnalysis/urls.py

@@ -0,0 +1,9 @@
+from django.conf.urls import url
+
+from . import views
+
+
+urlpatterns = [
+    url(r'^login/$', views.UserView.as_view(), name='login'),
+    url(r'^login_test/$', views.UserShowView.as_view(), name='login_test'),
+]

+ 31 - 0
apps/PestAnalysis/views.py

@@ -0,0 +1,31 @@
+from rest_framework.views import APIView
+from rest_framework.response import Response
+from django.contrib.auth import authenticate
+from utils.JWTAuthentication_diy import get_token,MyJWTAuthentication
+# Create your views here.
+
+
+class UserView(APIView):
+    #datail=True的时候,查询字符串携带pk
+    def post(self,request):
+        username = request.data.get('username')
+        password = request.data.get('password')
+        user = authenticate(username = username,password = password)
+        if user is not None:
+            token = get_token(user)
+            return Response(token)
+        else:
+            return Response("登录失败")
+
+
+class UserShowView(APIView):
+    #局部配置
+    authentication_classes = [MyJWTAuthentication]
+    # permission_classes = [IsAuthenticated]
+    def post(self,request):
+        token = request.auth
+        user = request.user
+        print(token)
+        print(user)
+        # print(user["user_modules"])
+        return Response("认证成功")

+ 1 - 2
apps/SearchEquip/urls.py

@@ -2,8 +2,7 @@ from django.conf.urls import url
 
 from . import views
 
-app_name = 'apps.SearchEquip'
 
 urlpatterns = [
-    url(r'^search', views.SearchEquip.as_view(), name='equip_search'),
+    url(r'^search/$', views.SearchEquip.as_view(), name='equip_search'),
 ]

+ 0 - 0
apps/UserApp/__init__.py


+ 3 - 0
apps/UserApp/admin.py

@@ -0,0 +1,3 @@
+from django.contrib import admin
+
+# Register your models here.

+ 5 - 0
apps/UserApp/apps.py

@@ -0,0 +1,5 @@
+from django.apps import AppConfig
+
+
+class UserappConfig(AppConfig):
+    name = 'apps.UserApp'

+ 20 - 0
apps/UserApp/models.py

@@ -0,0 +1,20 @@
+from django.db import models
+from django.contrib.auth.models import AbstractUser
+
+# Create your models here.
+
+class MyUser(AbstractUser):
+    USERMODULES_CHOICES = {
+        1: 'PestAnalysis',
+    }
+
+    user_remark = models.TextField(u'用户备注', max_length=200, blank=True)
+    user_modules = models.SmallIntegerField(
+        u'用户模块', default=1, choices=USERMODULES_CHOICES.items())
+
+    class Meta:
+        db_table = "myuser"
+        verbose_name = u'用户列表'
+        verbose_name_plural = verbose_name
+        ordering = ['-date_joined']
+        get_latest_by = 'date_joined'

+ 3 - 0
apps/UserApp/tests.py

@@ -0,0 +1,3 @@
+from django.test import TestCase
+
+# Create your tests here.

+ 3 - 0
apps/UserApp/views.py

@@ -0,0 +1,3 @@
+from django.shortcuts import render
+
+# Create your views here.

+ 12 - 2
bigdataAPI/settings.py

@@ -11,6 +11,7 @@ https://docs.djangoproject.com/en/2.1/ref/settings/
 """
 
 import os
+import datetime
 
 # Build paths inside the project like this: os.path.join(BASE_DIR, ...)
 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
@@ -37,9 +38,13 @@ INSTALLED_APPS = [
     'django.contrib.sessions',
     'django.contrib.messages',
     'django.contrib.staticfiles',
+    
     'rest_framework',
+    'rest_framework_jwt',
+    'apps.UserApp',
     'apps.SearchEquip',
-    'apps.IOTCard'
+    'apps.IOTCard',
+    'apps.PestAnalysis',
 ]
 
 MIDDLEWARE = [
@@ -128,7 +133,7 @@ USE_TZ = False
 STATIC_URL = '/static/'
 
 
-
+AUTH_USER_MODEL = 'UserApp.MyUser'
 
 REST_FRAMEWORK = {
     # 全局配置异常模块
@@ -138,3 +143,8 @@ REST_FRAMEWORK = {
         'utils.rendererresponse.CustomRender',
     ),
 }
+
+
+JWT_AUTH = {
+    'JWT_EXPIRATION_DELTA':datetime.timedelta(days=3),
+}

+ 1 - 0
bigdataAPI/urls.py

@@ -20,4 +20,5 @@ urlpatterns = [
     # path('admin/', admin.site.urls),
     path('equipmanager/', include('apps.SearchEquip.urls')),
     path('iotcard/', include('apps.IOTCard.urls')),
+    path('pestanalysis/', include('apps.PestAnalysis.urls')),
 ]

BIN
requirements.txt


+ 32 - 0
utils/AESencipher.py

@@ -0,0 +1,32 @@
+from Crypto.Cipher import AES
+import base64
+
+
+class aescrypt():
+    def __init__(self, key, model, iv, encode_):
+        self.encode_ = encode_
+        self.model = {'ECB': AES.MODE_ECB, 'CBC': AES.MODE_CBC}[model]
+        self.key = self.add_16(key)
+        if model == 'ECB':
+            self.aes = AES.new(self.key, self.model)
+        elif model == 'CBC':
+            self.aes = AES.new(self.key, self.model, iv)
+
+    def add_16(self, par):
+        par = par.encode(self.encode_)
+        if len(par) > 32:
+            par = par[0:32]
+        while len(par) % 32 != 0:
+            par += b'\x00'
+        return par
+
+    def aesencrypt(self, text):
+        text = self.add_16(text)
+        self.encrypt_text = self.aes.encrypt(text)
+        return base64.encodebytes(self.encrypt_text).decode().strip()
+
+    def aesdecrypt(self, text):
+        text = base64.decodebytes(text.encode(self.encode_))
+        self.decrypt_text = self.aes.decrypt(text)
+        return self.decrypt_text.decode(self.encode_).strip('\0')
+

+ 46 - 0
utils/JWTAuthentication_diy.py

@@ -0,0 +1,46 @@
+from rest_framework_jwt.serializers import jwt_encode_handler,jwt_decode_handler
+from rest_framework.authentication import BaseAuthentication
+from rest_framework.exceptions import AuthenticationFailed
+import jwt
+import json
+
+from .AESencipher import aescrypt
+
+PrAes = aescrypt('yf7232275', 'ECB', '', 'gbk')
+
+def get_token(user):
+    data = str(user.id) + "," + user.username + "," + str(user.user_modules)
+    data = PrAes.aesencrypt(data)
+    payload = {"token":data}
+    
+    token = jwt_encode_handler(payload)
+    return token
+
+
+class MyJWTAuthentication(BaseAuthentication):
+    def authenticate(self, request):
+        token = request.META.get('HTTP_AUTHORIZATION')
+        if token:
+            try:
+                payload = jwt_decode_handler(token)
+                data = payload["token"]
+                if '%2B' in data or " " in data:
+                    data = str(data).replace("%2B","+").replace(" ","+")
+                data = PrAes.aesdecrypt(data)
+                data_list = data.split(",")
+                user = {"uid":data_list[0],"username":data_list[1],"user_modules":data_list[2]}
+                return (user,token)
+            except jwt.ExpiredSignature:
+                msg = 'token过期'
+                raise AuthenticationFailed(msg)
+            except jwt.DecodeError:
+                msg = 'toke非法'
+                raise AuthenticationFailed(msg)
+            except jwt.InvalidTokenError:
+                msg = '用户非法'
+                raise AuthenticationFailed(msg)
+            except Exception as e:
+                msg=str(e)
+                raise AuthenticationFailed(msg)
+        raise AuthenticationFailed('token为空')
+