python—101 路飞学城知识储备 rest_framework 认证组件(登陆认证),权限组件(vip非vip权限),频率组件(ip访问次数)

认证组件:rest_framework 的里面的APIView里面的

所有都是先从全局,然后到局部找(加入局部有就会覆盖掉全局的),再找不到就会找默认的;

全局认证:在settings里面配置以下信息

REST_FRAMEWORK = {
    # 认证
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'app01.utils.auth.TokenAuth'
    ],
}

局部认证:在视图类下面写以下内容    加入全局设置了,

然后视图下面需要打开验证的话直接把列表内容清空就可以了;

authentication_classes = [TokenAuth, ]

 

为token生成一个当前时间+用户名md5加密的随机字符串

def get_random_str(user):
    import hashlib, time
    ctime = str(time.time())
    md5 = hashlib.md5(bytes(user, encoding='utf8'))
    md5.update(bytes(ctime, encoding='utf8'))
    return md5.hexdigest()

authToken认证: 检测访问用户是否是带有token字符串的用户,且校验数据库Token表的记录;

成功返回用户名和token表对象,失败返回rest_framework.exceptions的AuthenticationFailed的报错格式;

# token认证
class TokenAuth(BaseAuthentication):
    def authenticate(self, request):
        token = request.GET.get('token', None)
        token_obj =UserToken.objects.filter(token=token).first()
        if token_obj:
            return token_obj.user.user, token_obj
        else:
            raise AuthenticationFailed("认证失败!")

Login视图:

  在login里面加入auth认证   

 
 
from app01.utils.auth import TokenAuth

class LoginView(APIView):
# authentication_classes = [TokenAuth, ]  # 把我写好的认证组件放进 authentication_classes 列表里面
    def post(self, request):
        res = {'code': 1000, 'msg': None}
        try:
            user = request.data.get('user')
            pwd = request.data.get('pwd')
            user_obj = User.objects.filter(user=user, pwd=pwd).first()
            print(user_obj)
            if not user_obj:
                res['code'] = 1001
                res['msg'] = '用户名或者密码错误'
            else:
                # 创建新的token字符串
                token = get_random_str(user)
                # 更新或者创建如果有user就更新,没有就创建
                UserToken.objects.update_or_create(user=user_obj, defaults={'token': token})
                res['token'] = token

        except Exception as e:
            res['code'] = 1002
            res['msg'] = str(e)
        return JsonResponse(res, json_dumps_params={'ensure_ascii': False})

 

权限组件

 全局权限:

    #  rest_framework默认权限 都通过
    # 'DEFAULT_PERMISSION_CLASSES': (
    #     'rest_framework.permissions.AllowAny',
    # )

    #  自定义权限 仅限auth认证后的用户且是SVIP的才通过
    'DEFAULT_PERMISSION_CLASSES': (
        'app01.utils.permissions.SVIPPermission',
    )

 局部权限:

# 把权限放开
    permission_classes = []

自定义权限:

# 自定义权限认证
class SVIPPermission(object):
    message = '没有访问权限,请充值超级会员'

    def has_permission(self, request):
        # auth认证里面找到user对象的type字段值
        has_vip = request.auth.user.type

        if has_vip == 3:
            return True
        else:
            return False

默认权限:

from rest_framework.permissions import AllowAny
class SVIP(AllowAny):
    pass

频率组件

猜你喜欢

转载自www.cnblogs.com/kermitjam/p/9416097.html