drf - Django Rest Framework Permissions权限验证详解

来我的GitHub来看更多关于DRF的资料吧
十分钟学会DRF的企业级用法

官方解释:

权限检查总是在视图的最开始运行,然后才允许其他代码继续。权限检查通常使用请求中的身份验证信息。用户和请求。验证属性,以确定传入请求是否应被允许。 权
限用于授予或拒绝不同类型的用户对API不同部分的访问。
最简单的权限样式是允许访问任何经过身份验证的用户,拒绝访问任何未经身份验证的用户。这对应于REST框架中的IsAuthenticated类。

其实意思很简单就是你把权限验证加上,如果写单个的接口(直接def或者继承单一的generics类)这样就可以验证所有用户访问,如果用户没有权限,那就会401

如果是直接继承ModelViewSet 生成标准的restful接口时,你只想让普通用户使用get接口,其他类型接口也可以对对应的权限验证 🐂🐂🐂

DRF提供的几种权限验证类型
  • AllowAny:允许不受限制的访问,不管请求是否经过了身份验证。
  • IsAuthenticated:拒绝任何未经身份验证的用户的权限,而允许其他用户的权限。如果您希望您的API仅对注册用户可访问,则此权限是合适的。
  • IsAdminUser:拒绝任何用户的权限,除非use.is_staff为True,在这种情况下允许访问。
  • IsAuthenticatedOrReadOnly:允许经过身份验证的用户执行任何请求。对于未获授权用户的请求,会被允许GET、HEAD或OPTIONS。
permission_classes的几种定义
在接口类中的使用
class UserSigninAPIView(GenericAPIView):
    permission_classes = [IsAdminUser]
    ...
    ...
在方法中使用

drf提供了permission_classes装饰器来方便你的使用

@permission_classes([IsAdminUser])
def user_signin(request):
    pass
自定义权限认证类

因为使用drf默认的验证类时,在Postman等类似平台进行接口测试容易引发CSRF认证错误❌,所以自定义验证类。

自定义验证类需要继承自permissions.BasePermission,并且重写has_permission方法来定义您自己的验证类

has_permission方法return True或者False

class IsMyUser(permissions.BasePermission):
    """
    仅允许Token验证成功的用户访问
    """

    default_error_messages = {
        'invalid__token': 'token无效'
    }

    def has_permission(self, request, view):
        token = request.META.get("HTTP_TOKEN")
        user_token = Token.objects.filter(key=token).first()
        if not user_token:
            raise ParamsException(self.default_error_messages['invalid__token'], 401)
        if timezone.now() > (user_token.created + timedelta(days=TOKEN_LIFETIME)):
            raise ParamsException(self.default_error_messages['invalid__token'], 401)
        return True

自定义接口类中权限验证

如果你在一个接口类中定义了多个接口,但是你想让不同的用户访问到不同类型的接口,您就需要重写接口类中的get_permissions方法

以下面接口为例

ModelViewSet中会有list、retrieve、create…等方法,你可以在get_permissions通过self.action来获得他们并指定这些接口可访问的用户

class VideoModelViewSet(ModelViewSet):
    serializer_class = VideoSerializer
    queryset = Video.objects.all()

    def get_permissions(self):
        if self.action == "retrieve":
            return [IsExeUser()]
        return [IsAdmin()]
    ...
    ...

来我的GitHub来看更多关于DRF的资料吧

十分钟学会DRF的企业级用法

https://github.com/Tengxu666/DRF_Professional

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
Django REST framework (DRF) 可以使用 Token 认证、Session 认证和 JSON Web Token (JWT) 认证等方式进行登录验证。 其中,Token 认证和 Session 认证是最基本的认证方式,它们都使用了 Django 自带的用户认证系统,适合于简单的应用场景。Token 认证是通过在请求头中添加 Token 来进行认证,而 Session 认证则是在 Cookie 中保存 Session ID 来进行认证。 JWT 认证则是一种更加灵活和安全的认证方式,它使用了基于 JSON 的 Token,可以完全脱离 Django 自带的用户认证系统,支持跨域访问和分布式系统。JWT 认证需要在 DRF 中添加相应的中间件和配置,同时也需要在前端实现 Token 的生成和保存。 在 DRF 中使用 Token 认证或 Session 认证,只需要在 settings.py 文件中添加相应的认证方式,如: ```python REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': [ 'rest_framework.authentication.TokenAuthentication', 'rest_framework.authentication.SessionAuthentication', ], } ``` 在视图函数中使用 `@authentication_classes` 装饰器来指定认证方式,如: ```python from rest_framework.decorators import authentication_classes from rest_framework.authentication import TokenAuthentication, SessionAuthentication @authentication_classes([TokenAuthentication, SessionAuthentication]) @api_view(['GET']) def my_view(request): # ... ``` JWT 认证需要使用第三方库 `djangorestframework-jwt`,并在 settings.py 文件中添加相应的配置,如: ```python INSTALLED_APPS = [ # ... 'rest_framework', 'rest_framework_jwt', ] REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework_jwt.authentication.JSONWebTokenAuthentication', ), } JWT_AUTH = { 'JWT_SECRET_KEY': 'your_secret_key', 'JWT_ALGORITHM': 'HS256', 'JWT_ALLOW_REFRESH': True, 'JWT_EXPIRATION_DELTA': datetime.timedelta(days=7), 'JWT_REFRESH_EXPIRATION_DELTA': datetime.timedelta(days=30), } ``` 在视图函数中使用 `@jwt_authetication_classes` 装饰器来指定 JWT 认证方式,如: ```python from rest_framework_jwt.authentication import JSONWebTokenAuthentication from rest_framework.decorators import jwt_authetication_classes @jwt_authetication_classes([JSONWebTokenAuthentication]) @api_view(['GET']) def my_view(request): # ... ``` 以上是 DRF 中常见的登录验证方式,可以根据具体的应用场景选择合适的认证方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wxlo0.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值