DRF:源码剖析 - 权限组件

引言

前面介绍了 认证组件 ,有些url需要用户认证(登录)以后,才能够访问,而用户登录认证成功后,也不是所有的url,都可以访问,因此引出了权限的概念,也就是,不同的用户,拥有不同的权限,

比如某些网址只能VIP才能查看,所以这时候需要对权限进行控制。

认证组件:区分用户是否合法,是否存在

权限组件:判断合法的用户是否能访问该url

因此,权限是基于认证组件的,也就是必须认证之后,

权限组件

仍然以图书管理系统为例来介绍,其他的model、序列化组件,url,等于认证组件中一样

urls.py

urlpatterns = [
    # re_path(r'books/$', views.BookView.as_view()),
    # re_path(r'books/(?P<pk>\d+)/$', views.BookFilterView.as_view()),

  # 以下url,在权限类中只走 has_permission()方法 re_path(r'books/$', views.BookView.as_view({ 'get': 'list', 'post': 'create' })),

  # 以下传参url,在权限类中,先走 has_permission()方法,再走 has_object_permission()方法 re_path(r
'books/(?P<pk>\d+)/$', views.BookView.as_view({ 'get': 'retrieve', 'put': 'update', 'delete': 'destroy' })),
re_path(r
'user/$',views.UserView.as_view()) ]

 一、创建权限类


# 创建权限类
class UserPerm():
    message = '没有查看该数据的权限'

    def has_permission(self,request,view):     # 方法名是固定的 has_permission

        # return None        # 如果该方法直接return None, 那么会将message,返回给前端
if request.user.user_type == 1: return True return False def has_object_permission(self,request,view,obj): # 走单条数据的时候需要走这个方法,来进行判断是否有 return True

 

总结:

  1)request.user实际上就是,认证成功后,返回的token.user  ,再次访问其他网址,会携带在request.user 中

  2)权限类方法执行的顺序,

      无参url,在权限类中只走 has_permission()方法; 

      传参url,在权限类中,先走 has_permission()方法,再走 has_object_permission()方法,不写会报错

二、视图类中添加权限类

class BookView(ModelViewSet):

    authentication_classes = [UserAuth]   # 指定认证的类,变量名必须是 authentication_classes,必须先添加认证类,再添加权限类
    permission_classes = [UserPerm]   # 指定权限类,变量名必须是 permission_classes

    queryset = Book.objects.all()
    serializer_class = BookSerializer

 

posted @ 2018-12-11 08:42  葡萄想柠檬  Views(135)  Comments(0)    收藏  举报
目录代码