赞
踩
- 1.session认证:
- # # 全局所有页面都有权限认证
- # REST_FRAMEWORK = {
- # 'DEFAULT_AUTHENTICATION_CLASSES': (
- # 'rest_framework.authentication.BasicAuthentication',
- # 'rest_framework.authentication.SessionAuthentication',
- # ),
- # 'DEFAULT_PERMISSION_CLASSES': [
- # 'rest_framework.permissions.IsAuthenticated',
- # ]
- # }
-
- # 局部类添加定制身份权限认证
- # 设置需要身份验证的类
- authentication_classes = [BasicAuthentication, SessionAuthentication]
- # # 全类权限认证
- # permission_classes = [IsAuthenticated]
-
- def get_permissions(self):
- # 定制类内方法权限认证
- if self.action == 'create':
- return []
- else:
- return [IsAuthenticated,]
-
- def get_serializer_class(self):
- # 根据不同的动作调用不同的序列化类
- if self.action == 'retrieve':
- # 登录
- return UserSerializer
- elif self.action == 'create':
- # 注册
- return RegisterSerializer
- return UserSerializer
- 2.Token认证
- 优点:1、无状态
- token 自身包含了身份验证所需要的所有信息,使得我们的服务器不需要存储 Session 信息,这显然增加了系统的可用性和伸缩性,大大减轻了服务端的压力。
- 2、防止CSRF 攻击
- CSRF(Cross Site Request Forgery) 一般被翻译为 跨站请求伪造,属于网络攻击领域范围。构成这个攻击的原因,就在于 Cookie + Session 的鉴权方式中,鉴权数据(cookie 中的 session_id)是由浏览器自动携带发送到服务端的,借助这个特性,攻击者就可以通过让用户误点攻击链接,达到攻击效果。而 token 是通过客户端本身逻辑作为动态参数加到请求中的,token 也不会轻易泄露出去,因此 token 在 CSRF 防御方面存在天然优势。
- 3、适合移动应用
- 移动端上不支持 cookie,而 token 只要客户端能够进行存储就能够使用,因此 token 在移动端上也具有优势。
- 4、单点登录友好
- 使用 Session 进行身份认证的话,实现单点登录,需要我们把用户的 Session 信息保存在一台电脑上,并且还会遇到常见的 Cookie 跨域的问题。但是,使用 token 进行认证的话, token 被保存在客户端,不会存在这些问题。
- 步骤:
- 1.在settings添加应用 'rest_framework.authtoken',并迁移
- 2.url:from rest_framework.authtoken import views
- re_path(r'api-token-auth/', views.obtain_auth_token)
- 用username和password登录后会产生token
- {
- "token": "c5aa5eea68e1278665fb6239748b9c040c666182"
- }
-
- 3.views里添加Token认证
- # 局部添加定制身份权限认证
- # 设置需要身份验证的类
- authentication_classes = [BasicAuthentication, TokenAuthentication]
- # 全类权限认证
- permission_classes = [IsAuthenticated]
-
- 用户未登录就会拦截,必需将token添加到请求头中
- key : value
- Authorization: Token 9944b09199c62bcf9418ad846dd0e4bbdfc6ee4b
- 3.JWT认证
- token缺陷:
- 1.token 会被永久保存,不安全
- 2.对于分布式系统,需要同步token。
- JWT优点:
- 1.可扩展性好 应用程序分布式部署的情况下,session需要做多机数据共享,通常可以存在数据库或者redis里面。而jwt不需要。
- 2.无状态 jwt不在服务端存储任何状态。RESTful API的原则之一是无状态,发出请求时,总会返回带有参数的响应,不会产生附加影响。
- 用户的认证状态引入这种附加影响,这破坏了这一原则。另外jwt的载荷中可以存储一些常用信息,用于交换信息,有效地使用 JWT,可以降低服务器查询数据库的次数。
- 3.基于JSON,方便解析,可以在令牌中自定义丰富内容,易扩展。通过非对称加密及数字签名技术,可以防止篡改、安全性高。可以不依赖认证服务就可以完成授权。
- 缺点: JWT令牌较长,占存储空间比较大。
- 步骤:
- 1.安装:pip install djangorestframework-simplejwt
- 2.配置
- 全局配置:在settings里添加
- REST_FRAMEWORK = {
- 'DEFAULT_AUTHENTICATION_CLASSES': [
- 'rest_framework_simplejwt.authentication.JWTAuthentication',
- ],
- }
- 局部配置:
- # 局部添加定制身份权限认证
- # 设置需要身份验证的类
- authentication_classes = [BasicAuthentication, JWTAuthentication]
- # 全类权限认证
- permission_classes = [IsAuthenticated, ]
- 3.url:
- path('api/auth/token/obtain/', TokenObtainPairView.as_view()),
- 登录获得
- {
- "refresh": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ0b2tlbl90eXBlIjoicmVmcmVzaCIsImV4cCI6MTY1MDYxMjUyOCwiaWF0IjoxNjUwNTI2MTI4LCJqdGkiOiI2N2ZlNTFkNjY2Njc0N2IxOGFlYTdjYzZiZmZkNmZhZSIsInVzZXJfaWQiOjN9.DfxUbpzelHVEK6RLk7FGke-tp6SAcv4Qj8UTkeR6_Aw",
- "access": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNjUwNTI2NDI4LCJpYXQiOjE2NTA1MjYxMjgsImp0aSI6IjgzZTdhNWFlMTY3ZDRhMjhiZTljNGE4MmNkMGQ4MGExIiwidXNlcl9pZCI6M30.lq-O7tbBPkYKvme9Wpd6tS8YgduRKPnGsR4eA8eODjw"
- }
-
- 请求地址path('api/login/', MovieListViewSet.as_view({'get': 'list'}))
- 在请求头添加
- key : value
- Authorization: Bearer access
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。