<input id="c4ek0"></input><menu id="c4ek0"></menu>
  • <menu id="c4ek0"></menu>
  • <menu id="c4ek0"></menu>
  • <object id="c4ek0"></object>
    <nav id="c4ek0"></nav>
    <menu id="c4ek0"></menu>
  • <menu id="c4ek0"></menu><input id="c4ek0"><tt id="c4ek0"></tt></input>

    drf三大认证

    源码分析

      dispath方法内 self.initial(request, *args, **kwargs) 进入三大认证

            # 认证组件:校验用户(游客,合法用户,非法用户)
            # 游客:代表校验通过直接进入下一步校验,
            # 合法用户:代表校验通过,将用户存储在request.user中,在进入下一步校验
            # 非法用户:代表校验失败,抛出异常,返回403权限异常结果
            self.perform_authentication(request)
            # 权限组件:校验用户权限,必须登录,所有用户登录读写,游客只读,自定义用户角色
            # 认证通过:可以进入下一步校验
            # 认证失败:抛出异常,返回403权限异常结果
            self.check_permissions(request)
            # 频率组件:限制视图接口被访问的频率次数  限制的条件
            # 没有达到限次:正常访问接口
            # 达到限次:限制时间内不能访问,限制时间到达后,可以重新访问
            self.check_throttles(request)    

    认证组件

    def _authenticate(self):
            # 遍历拿到一个个认证器,进行认证
            # self.authenticators配置的一堆认证类产生的认证类对象组成的 list
            for authenticator in self.authenticators:
                try:
                    # 认证器(对象)调用认证方法authenticate(认证类对象self, request请求对象)
                    # 返回值:登陆的用户与认证的信息组成的 tuple
                    # 该方法被try包裹,代表该方法会抛异常,抛异常就代表认证失败
                    user_auth_tuple = authenticator.authenticate(self)
                except exceptions.APIException:
                    self._not_authenticated()
                    raise
    
                # 返回值的处理
                if user_auth_tuple is not None:
                    self._authenticator = authenticator
                    # 如何有返回值,就将 登陆用户 与 登陆认证 分别保存到 request.user、request.auth
                    self.user, self.auth = user_auth_tuple
                    return
            # 如果返回值user_auth_tuple为空,代表认证通过,但是没有 登陆用户 与 登陆认证信息,代表游客
            self._not_authenticated()

    权限组件

    self.check_permissions(request)
        认证细则:
        def check_permissions(self, request):
            # 遍历权限对象列表得到一个个权限对象(权限器),进行权限认证
            for permission in self.get_permissions():
                # 权限类一定有一个has_permission权限方法,用来做权限认证的
                # 参数:权限对象self、请求对象request、视图类对象
                # 返回值:有权限返回True,无权限返回False
                if not permission.has_permission(request, self):
                    self.permission_denied(
                        request, message=getattr(permission, message, None)
                    )

    权限六表分析

    models.py

    from django.db import models
    
    # Create your models here.
    
    # 如果自定义User表后,再另一个项目中采用原生User表,完成数据迁移时,可能失败
    # 1.卸载Django,重新装
    # 2.将Django.contrib下面的admin\auth下的数据库记录文件清空
    from django.contrib.auth.models import AbstractUser
    
    class User(AbstractUser):
        mobile = models.CharField(max_length=11,unique=True)
    
        class Meta:
            db_table = api_user
            verbose_name = 用户表
            verbose_name_plural = verbose_name
    
        def __str__(self):
            return self.username

    t_model.py

    # django脚本话启动
    import os, django
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day74.settings")
    django.setup()
    
    from api import models
    
    user = models.User.objects.first()
    # print(user.username)
    # print(user.groups.first().name)
    # print(user.user_permissions.first().name)
    
    from django.contrib.auth.models import Group
    group = Group.objects.first()
    # print(group.name)
    # print(group.user_set.first().username)
    # print(group.permissions.first().name)
    
    
    from django.contrib.auth.models import Permission
    p_16 = Permission.objects.filter(pk=16).first()
    print(p_16.user_set.first().username)
    p_17 = Permission.objects.filter(pk=17).first()
    print(p_17.group_set.first().name)

    自定义认证类

    settings.py

    # drf配置
    REST_FRAMEWORK = {
        # 认证类配置
        DEFAULT_AUTHENTICATION_CLASSES: [
            # rest_framework.authentication.SessionAuthentication,
            # rest_framework.authentication.BasicAuthentication,
            api.authentications.MyAuthentication,
            ],
    }

    authentications.py

    from rest_framework.authentication import BaseAuthentication
    from rest_framework.exceptions import AuthenticationFailed
    from . import models
    class MyAuthentication(BaseAuthentication):
        # 同前台请求拿认证信息auth,没有auth是游客,返回None
        # 有auth进行校验   失败是非法用户抛异常,成功是合法用户,返回(用户,认证信息)
        def authenticate(self, request):
            # 前台在请求头携带信息。默认用Authorization字段携带认证信息
            # 后台固定在请求对象的META字段中HTTP_AUTHORIZATION获取
            auth = request.META.get(HTTP_AUTHORIZATION,None)
    
            # 处理游客
            if auth is None:
                return None
    
            # 设置认证字段
            auth_list = auth.split()
            # 校验合法还是非法
            if not (len(auth_list) == 2 and auth_list[0].lower() == auth):
                raise AuthenticationFailed(认证信息有误,非法用户)
    
            # 合法用户需要从auth_list[1]中解析出来
            if auth_list[1] != abc.123.xyz: # 校验失败
                raise AuthenticationFailed(用户校验失败,非法用户)
    
            user = models.User.objects.filter(username=admin).first()
    
            if not user:
                raise AuthenticationFailed(用户数据有误,非法用户)
            return (user, None)

    系统权限类

    1)AllowAny:
        认证规则全部返还True:return True
            游客与登陆用户都有所有权限
    
    2) IsAuthenticated:
        认证规则必须有登陆的合法用户:return bool(request.user and request.user.is_authenticated)
            游客没有任何权限,登陆用户才有权限
        
    3) IsAdminUser:
        认证规则必须是后台管理用户:return bool(request.user and request.user.is_staff)
            游客没有任何权限,登陆用户才有权限
    
    4) IsAuthenticatedOrReadOnly
        认证规则必须是只读请求或是合法用户:
            return bool(
                request.method in SAFE_METHODS or
                request.user and
                request.user.is_authenticated
            )
            游客只读,合法用户无限制

      urls.py

    from django.conf.urls import url
    from . import views
    
    urlpatterns = [
        url(r^test, views.TestAPIView.as_view()),
       url(r‘^test1‘, views.TestAuthenticatedAPIView.as_view()),
    ]

    settings.py

    REST_FRAMEWORK = {
        # 权限类配置
        DEFAULT_PERMISSION_CLASSES: [
            rest_framework.permissions.AllowAny,
        ],
    }

    api/views.py

    from rest_framework.views import APIView
    from rest_framework.generics import GenericAPIView
    from rest_framework.viewsets import GenericViewSet,ViewSet
    from utils.response import APIResponse
    from rest_framework.permissions import IsAuthenticated
    
    class TestAPIView(APIView):
        def get(self, request, *args, **kwargs):
            return APIResponse(0, test get ok)
    
    
    class TestAuthenticatedAPIView(APIView):
        permission_classes = [IsAuthenticated]
        def get(self, request, *args, **kwargs):
            return APIResponse(0,test 登录才能访问接口 ok)

    自定义权限类

      创建继承BasePermission的权限类,  实现has_permission方法,  实现体根据权限规则 确定有无权限,  进行全局或局部配置

    认证规则:  满足设置的用户条件,代表有权限,返回True,  不满足设置的用户条件,代表有权限,返回False

    urls.py

    from django.conf.urls import url
    from . import views
    
    urlpatterns = [
        url(r^test2, views.TestAdminOrReadOnlyAPIView.as_view()),
    ]

    permissions.py

    from rest_framework.permissions import BasePermission
    from django.contrib.auth.models import Group
    class MyPermission(BasePermission):
      # 只读接口判断 def has_permission(self, request, view): r1
    = request.method in (GET, HEAD, OPTIONS)
        # group为当前所属的所有分组 group
    = Group.objects.filter(name=管理员).first() groups = request.user.groups.all() r2 = group and groups r3 = group in groups
        # 读接口都权限,写接口必须指定分组下的登录用户
    return r1 or (r2 and r3)

    views.py

    # 游客只读,登录用户只读,只有登录用户属于管理员分组,才可以增删改
    from
    utils.permissions import MyPermission class TestAdminOrReadOnlyAPIView(APIView): permission_classes = [MyPermission]
      # 所有用户都可以访问 def
    get(self, request, *args, **kwargs): return APIResponse(0, 自定义读 OK)
      # 必须是自定义管理员分组下的用户 def post(self, request,
    *args, **kwargs): return APIResponse(0, 自定义写 OK)
    相关文章
    相关标签/搜索
    每日一句
      每一个你不满意的现在,都有一个你没有努力的曾经。
    公众号推荐
       一个历史类的公众号,欢迎关注
    一两拨千金
    2019财神爷之高手论坛 昌宁县| 锦州市| 县级市| 玉屏| 乌鲁木齐市| 高清| 民乐县| 灵璧县| 晋江市| 孝感市| 延川县| 临西县| 藁城市| 中阳县| 阿荣旗| 贺州市| 方山县| 司法| 康乐县| 五台县| 抚顺市| 方城县| 炉霍县| 夏河县| 科技| 扎囊县| 白玉县| 博兴县| 诸城市| 虞城县| 久治县| 名山县| 扎鲁特旗| 马公市| 尉氏县| 昆山市| 仙桃市| 鲜城| 宁化县| 长岛县| 准格尔旗| 石棉县| 大埔县| 大悟县| 沿河| 玉田县| 拉萨市| 丽水市| 克什克腾旗| 高雄县| 天柱县| 砀山县| 咸宁市| 屯昌县| 洛南县| 天柱县| 略阳县| 会宁县| 赤水市| 青岛市| 嘉义县| 石台县| 德化县| 大方县| 左权县| 蒙阴县| 邵阳县| 玛沁县| 宜宾市| 新化县| 右玉县| 米易县| 无极县| 蓝山县| 汝州市| 北票市| 宁晋县| 惠安县| 醴陵市| 海南省| 玛沁县| 肥东县| 阳春市| 隆回县| 濮阳县| 和顺县| 通海县| 兴山县| 遵化市| 新郑市| 达孜县| 台中县| 广宗县| 浦东新区| 霍林郭勒市| 大英县| 南雄市| 肥城市| 阜宁县| 翼城县| 关岭| 鱼台县| 清丰县| 大石桥市| 琼结县| 海宁市| 交城县| 江川县| 金昌市| 阿鲁科尔沁旗| 睢宁县| 余姚市| 汶上县| 鄂托克前旗| 兴安盟| 旅游| 赣榆县| 德兴市| 富阳市| 门头沟区| 惠东县| 沅陵县| 拜城县| 杭州市| 通河县| 浙江省| 韶关市| 雷波县| 广西| 新宁县| 扶沟县| 咸丰县| 绵竹市| 修武县| 阿拉尔市| 呼和浩特市| 大新县| 南江县| 娱乐| 小金县| 渝中区| 璧山县| 兴文县| 芷江| 平原县| 襄樊市| 依安县| 嘉荫县| 江安县| 鹤岗市| 汝城县| 武定县| 鞍山市| 双流县| 东山县| 疏勒县| 宜黄县| 六安市| 乳山市| 阿鲁科尔沁旗| 汽车| 手机| 临朐县| 广平县| 呼伦贝尔市| 乌审旗| 白水县| 肥东县| 喜德县| 东港市| 胶南市| 柳州市| 庆城县| 家居| 桂阳县| 团风县| 儋州市| 嫩江县| 尚志市| 北辰区| 皮山县| 平和县| 西盟| 堆龙德庆县| 太康县| 民丰县| 乡宁县| 潜江市| 黄平县| 贵阳市| 大新县| 纳雍县| 徐闻县| 盐源县| 富源县| 将乐县| 大城县| 兴宁市| 阿图什市| 望都县| 射阳县| 昭平县| 普定县| 米泉市| 望都县| 奎屯市| 平山县| 宕昌县| 淳化县| 洛隆县| 汝州市| 和林格尔县| 赞皇县| 安国市| 筠连县| 河西区| 伊川县| 宁明县| 南投县| 澜沧| 平南县| 武隆县| 福贡县| 福贡县| 福贡县| 洪江市| 晋宁县| 安多县| 年辖:市辖区| 年辖:市辖区| 肥城市| 灯塔市| 团风县| 囊谦县| 崇明县| 永康市| 惠东县| 江口县| 迁西县| 黄骅市| 涿鹿县| 滦南县| 富宁县| 弥勒县| 商丘市| 布尔津县| 岳池县| 曲沃县| 攀枝花市| 阿勒泰市| 于田县| 邢台县| 井冈山市| 郓城县| 革吉县| 天祝| 沙湾县| 金川县| 衡阳市| 什邡市| 永泰县| 康平县| 九江县| 苗栗县| 溆浦县| 班玛县| 兴城市| 安图县| 桦南县| 大庆市| 无锡市| 方山县| 满城县| 阜新| 安远县| 濉溪县| 成安县| 北流市| 三门县| 贺兰县| 肃宁县| 通海县| 西平县| 马山县| 大洼县| 霍邱县| 金川县| 什邡市| 宁明县| 宣威市| 资中县| 竹溪县| 曲阜市| 安庆市| 长治县| 贵港市| 昌平区| 沂源县| 巧家县| 长海县| 通河县| 宜昌市| 宜州市| 包头市| 喀喇沁旗| 镶黄旗| 内丘县| 莎车县| 驻马店市| 皋兰县| 威海市| 甘德县| 东山县| 潜江市| 玉门市| 盖州市| 金华市| 竹溪县| 平舆县| 巴塘县| 海原县| 永济市| 游戏| 宜丰县| 青田县| 呼图壁县| 汨罗市| 文成县| 元朗区| 鲁山县| 察隅县| 黄浦区| 海南省| 鄂尔多斯市| 平凉市| 宁武县| 信丰县| 瑞昌市| 临海市| 二连浩特市| 彭泽县| 松原市| 乌兰县| 安西县| 丰县| 长兴县| 桑日县| 尚义县| 固镇县| 电白县| 察隅县| 南宫市| 襄樊市| 阳朔县| 咸阳市| 连城县| 天气| 亳州市| 岐山县| 阳春市| 故城县| 连平县| 同心县| 齐河县| 塘沽区| 泸西县| 拉萨市| 湟源县| 乌兰察布市| 岳普湖县| 镇巴县| 赫章县| 怀集县| 南康市| 阿拉善盟| 石棉县| 文水县| 泾阳县| 乐清市| 萨嘎县| 南漳县| 万盛区| 南皮县| 宜黄县| 丹东市| 阿拉善右旗| 贵溪市| 普格县| 栾川县| 紫金县| 沂源县| 邯郸市| 宜良县| 凤城市| 滦南县| 徐闻县| 安国市| 平武县| 沁阳市| 德令哈市| 临城县| 手机| 琼海市| 军事| 桂平市| 石泉县| 建昌县| 方城县| 高邮市| 米林县| 鹤岗市| 荣昌县| 西青区| 宁国市| 紫金县| 同心县| 怀安县| 绥芬河市| 庆元县| 齐齐哈尔市| 遂川县| 朝阳县| 景谷| 江陵县| 鱼台县| 枝江市| 金坛市| 景东| 黑龙江省| 神农架林区| 化德县| 济阳县| 巴南区| 白水县| 海晏县| 商都县| 临沭县| 锡林浩特市| 嘉祥县| 栾川县| 方正县| 高雄县| 延长县| 大余县| 青龙| 含山县| 宜兰县| 来安县| 托里县| 建宁县| 石泉县| 张北县| 金华市| 政和县| 瑞昌市| 清水河县| 油尖旺区| 西乌| 五台县| 治多县| 永新县| 普兰店市| 平昌县| 靖江市| 甘肃省| 潜江市| 沧源| 页游| 浮梁县| 慈溪市| 长兴县| 嘉荫县| 武汉市| 聊城市| 台州市| 上杭县| 怀仁县| 和田县| 绵阳市| 卫辉市| 千阳县| 湛江市| 镇赉县| 福贡县| 旬阳县| 灵丘县| 海宁市| 揭阳市| 龙州县| 久治县| 宜川县| 左贡县| 十堰市| 双鸭山市| 大名县| 和田市| 闽侯县| 延庆县| 工布江达县| 聊城市| 布拖县| 新疆| 大姚县| 漠河县| 泉州市| 郴州市| 大冶市| 揭阳市| 从化市| 资源县| 井冈山市| 望都县| 神池县| 平凉市| 武陟县| 抚顺县| 潮安县| 双辽市| 潮州市| 安国市| 漠河县| 菏泽市| 澄迈县| 巴马| 襄汾县| 崇文区| 江华| 琼海市| 嘉定区| 临洮县| 无锡市| 吴忠市| 靖西县| 明水县| 礼泉县| 当涂县| 同德县| 章丘市| 韶关市| 东乡族自治县| 临武县| 武功县| 额敏县| 民丰县| 弥渡县| 神农架林区| 荔波县| 册亨县| 崇仁县| 都兰县| 林州市| 育儿| 通城县| 墨脱县| 乌兰察布市| 新乡县| 昆明市| 图片| 房山区| 广平县| 晋宁县| 密山市| 乡宁县| 融水| 老河口市| 东海县| 玉溪市| 睢宁县| 宁远县| 甘泉县| 榆树市| 台州市| 衡东县| 防城港市| 山阴县| 大丰市| 上栗县| 咸宁市| 绵阳市| 喜德县| 灌阳县| 大石桥市| 抚宁县| 神木县| 嘉兴市| 惠东县| 天津市| 昌乐县| 米林县| 彩票| 玛纳斯县| 多伦县| 时尚| 大连市| 五原县| 鄂温| 丘北县| 隆安县| 衡阳市| 罗源县| 孟津县| 探索| 内乡县| 莱西市| 岫岩| 花垣县| 双柏县| 清河县| 台山市| 晋宁县| 兴和县| 龙江县| 介休市| 东阳市| 平泉县| http://www.japcoc.fit http://m.lvbror.fit http://bbxesr.fit http://www.dkibca.fit http://www.imjnmj.fit http://wap.bm1961networkz.fit http://www.wvoarp.fit http://www.ytaaky.fit http://www.luxrky.fit http://www.ktcsfc.fit http://m.zjlbaa.fit http://m.rrmssw.fit http://wap.gorisy.fit http://wap.skyebf.fit http://ghofqn.fit http://wap.xvputn.fit http://wap.hvcbff.fit http://wap.hviunj.fit