zoukankan      html  css  js  c++  java
  • framework —— permission(权限)

    framework —— permission(权限)

    1.目录结构

      

    2.urls.py:

    from django.conf.urls import url
    from django.contrib import admin
    from app02 import views as app02_view
    
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^hosts/',app02_view.HostView.as_view()),
        url(r'^auth/$',app02_view.AuthView.as_view()),
        url(r'^salary/',app02_view.SalaryView.as_view()),
        url(r'user/',app02_view.UserView.as_view())
    ]

    3.utils.py:

    from django.shortcuts import render,HttpResponse
    from rest_framework.request import Request
    from rest_framework.exceptions import APIException
    from rest_framework.response import Response
    from rest_framework.authentication import BaseAuthentication
    from app02 import models
    
    
    
    
    class MyAuthentication(BaseAuthentication):
        def authenticate(self,request):
            token = request.query_params.get('token')
            obj = models.Userinfo.objects.filter(token=token).first()
            if obj:
                return obj(obj.username,obj)
            raise  APIException('用户认证失败')

    4.view.py:

    from django.shortcuts import render,HttpResponse
    from rest_framework.views import APIView
    from rest_framework.request import Request
    from rest_framework.exceptions import APIException
    from rest_framework.response import Response
    from rest_framework.authentication import BaseAuthentication
    import time
    import hashlib
    # Create your views here.
    
    from app02 import models
    
    
    #认证的时候用到,生成token, 权限这快可以不需要。
    class MyAuthentication(BaseAuthentication):
        """
        All authentication classes should extend BaseAuthentication.
        """
    
        def authenticate(self, request):
            """
            Authenticate the request and return a two-tuple of (user, token).
            """
            token = request.query_params.get('token')
            obj = models.Userinfo.objects.filter(token=token).first()
            if obj:
                return (obj.username,obj)
            return None
    
        def authenticate_header(self, request):
            """
            Return a string to be used as the value of the `WWW-Authenticate`
            header in a `401 Unauthenticated` response, or `None` if the
            authentication scheme should return `403 Permission Denied` responses.
            """
            pass
    
    class MyPermission(object):
        message = "无权访问"
        def has_permission(self,request,view):
            if request.user:
                # print(request.user)
                return True
            return False
    
    class AdminPermission(object):
        message = "无权访问"
        def has_permission(self,request,view):
            if request.user == 'zxc':
                return True
            return False
    
    class AuthView(APIView):
        authentication_classes = []
        def get(self,request):
            '''
            接收用户名和密码
            :param request:
            :return:
            '''
            ret ={"code":1000,"msg":None}
            user = request.query_params.get('user')
            pwd = request.query_params.get('pwd')
            user_obj = models.Userinfo.objects.filter(username=user,password=pwd).first()
            if not user_obj:
                ret['code'] = 1001
                ret['msg'] = "用户名或密码错误"
                return  Response(ret)
    
            #创建随机字符串
            ctime = time.time()
            key = "%s|%s"%(user,pwd)
            m = hashlib.md5()
            m.update(key.encode('utf-8'))
            token = m.hexdigest()
            #保存到数据
            user_obj.token = token
            user_obj.save()
    
            ret['token'] = token
            # return Response(ret)
    
    
    class HostView(APIView):
        '''
        匿名用户和管理用户都能访问
        '''
        authentication_classes = [MyAuthentication,]
        permission_classes = []
    
        def get(self,request,*args,**kwargs):
    
            self.dispatch
            # print(request.user)
            # print(request.auth)
            return Response('主机列表')
    
    class UserView(APIView):
        '''
        用户能访问
        '''
        authentication_classes = [MyAuthentication,]
        permission_classes = [MyPermission]
    
        def get(self,request,*args,**kwargs):
            print('========',request.user)
            return Response('用户列表')
    
    class SalaryView(APIView):
        '''
        管理员能访问
        '''
        authentication_classes = [MyAuthentication,]
        permission_classes = [MyPermission,AdminPermission]
    
        def get(self,request,*args,**kwargs):
            return Response('薪资列表')
  • 相关阅读:
    openssl 自己制作ssl证书:自己签发免费ssl证书,为nginx生成自签名ssl证书
    【nginx】一台nginx服务器多域名配置
    使用 Microsoft.Web.Administration 管理iis
    Android TextView : “Do not concatenate text displayed with setText”
    Android中将十六进制 颜色代码 转换为int类型数值
    android-getTextSize返回值是以像素(px)为单位的,setTextSize()以sp为单位
    Android属性allowBackup安全风险浅析
    Android 如何保持屏幕常亮
    Android 控制ScrollView滚动到底部
    Android 自定义TextView 实现文本间距
  • 原文地址:https://www.cnblogs.com/zhongbokun/p/8423408.html
Copyright © 2011-2022 走看看