django 权限

方法一
系统:
1)AllowAny:允许所有用户,校验方法直接返回True
2)IsAuthenticated:只允许登录用户
    必须request.user和request.user.is_authenticated都通过
3)IsAuthenticatedOrReadOnly:游客只读,登录用户无限制
    get、option、head 请求无限制
    前台请求必须校验 request.user和request.user.is_authenticated
4)IsAdminUser:是否是后台用户
    校验 request.user和request.user.is_staff    is_staff(可以登录后台管理系统的用户)
    
方法二
自定义:基于auth的Group与Permission表
1)自定义权限类,继承BasePermission,重写has_permission
2)has_permission中完成
    拿到登录用户 user <= request.user
    校验user的分组或是权限
    前两步操作失败 返回False => 无权限
    前两步操作成功 返回True => 有权限

 

流程

当用户执行一个业务的时候,运行了as_view方法,进入了APIView类的dispatch方法

  1. (此处不需要封装request了,因为在认证过程中封装了)
  2. 进入self.initial方法中的self.check_permissions(request)方法
  3. 里面执行了for循环,把每个权限类实例化对象

 # 以上是drf源码内容,下面为自定义方法

  1. 执行自己定义的权限类里面的has_permission方法,里面会判断request.user是否存在
  2. 不存在就返回False,存在就返回True
  3. 之后执行self.permission_denied报错方法,返回的是False就报错,可以自定义报错信息,在has_permission方法中写message = {"status": False, "error": "登录成功之后才能评论"},就实现了自定义报错
  4. 如果返回的是True就让他进入功能

 

authentication 自定义:

设计思路:
1. 登录时生成 token, 以 token 为键,以用户信息如user_id为值,存储在 redis 中,设置 key 过期时间
2. 需要身份验证的接口,带上 token
3. 接口校验 redis 中 token 是否存在
4. 存在则更新 token 过期时间,不存在则身份校验不通过
5. 存储的信息可从 redis 中读取

 

 permission:

 

 

 

posted @ 2020-12-24 19:51  不带R的墨菲特  阅读(217)  评论(0)    收藏  举报