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

浙公网安备 33010602011771号