功能变化: 加入浏览器单点登录
parent
2e62e70310
commit
46a809001a
|
@ -29,7 +29,7 @@ from dvadmin.system.views.login import (
|
||||||
LoginView,
|
LoginView,
|
||||||
CaptchaView,
|
CaptchaView,
|
||||||
ApiLogin,
|
ApiLogin,
|
||||||
LogoutView,
|
LogoutView, CustomTokenRefreshView,
|
||||||
)
|
)
|
||||||
from dvadmin.system.views.system_config import InitSettingsViewSet
|
from dvadmin.system.views.system_config import InitSettingsViewSet
|
||||||
from dvadmin.utils.swagger import CustomOpenAPISchemaGenerator
|
from dvadmin.utils.swagger import CustomOpenAPISchemaGenerator
|
||||||
|
@ -73,7 +73,7 @@ urlpatterns = (
|
||||||
path("api/system/", include("dvadmin.system.urls")),
|
path("api/system/", include("dvadmin.system.urls")),
|
||||||
path("api/login/", LoginView.as_view(), name="token_obtain_pair"),
|
path("api/login/", LoginView.as_view(), name="token_obtain_pair"),
|
||||||
path("api/logout/", LogoutView.as_view(), name="token_obtain_pair"),
|
path("api/logout/", LogoutView.as_view(), name="token_obtain_pair"),
|
||||||
path("token/refresh/", TokenRefreshView.as_view(), name="token_refresh"),
|
path("token/refresh/", CustomTokenRefreshView.as_view(), name="token_refresh"),
|
||||||
re_path(
|
re_path(
|
||||||
r"^api-auth/", include("rest_framework.urls", namespace="rest_framework")
|
r"^api-auth/", include("rest_framework.urls", namespace="rest_framework")
|
||||||
),
|
),
|
||||||
|
|
|
@ -10,8 +10,11 @@ from django.utils.translation import gettext_lazy as _
|
||||||
from drf_yasg import openapi
|
from drf_yasg import openapi
|
||||||
from drf_yasg.utils import swagger_auto_schema
|
from drf_yasg.utils import swagger_auto_schema
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
|
from rest_framework.status import HTTP_401_UNAUTHORIZED
|
||||||
from rest_framework.views import APIView
|
from rest_framework.views import APIView
|
||||||
|
from rest_framework_simplejwt.authentication import JWTAuthentication
|
||||||
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
|
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
|
||||||
|
from rest_framework_simplejwt.token_blacklist.models import OutstandingToken
|
||||||
from rest_framework_simplejwt.tokens import RefreshToken, AccessToken
|
from rest_framework_simplejwt.tokens import RefreshToken, AccessToken
|
||||||
from rest_framework_simplejwt.views import TokenObtainPairView, TokenRefreshView
|
from rest_framework_simplejwt.views import TokenObtainPairView, TokenRefreshView
|
||||||
|
|
||||||
|
@ -107,14 +110,30 @@ class LoginSerializer(TokenObtainPairSerializer):
|
||||||
# 记录登录日志
|
# 记录登录日志
|
||||||
save_login_log(request=request)
|
save_login_log(request=request)
|
||||||
# 将之前登录用户的token加入黑名单
|
# 将之前登录用户的token加入黑名单
|
||||||
last_token = self.user.last_token
|
user = Users.objects.filter(id=self.user.id).values('last_token').first()
|
||||||
|
last_token = user.get('last_token')
|
||||||
if last_token:
|
if last_token:
|
||||||
token = RefreshToken(last_token)
|
token = RefreshToken(last_token)
|
||||||
token.blacklist()
|
token.blacklist()
|
||||||
# 将最新的token保存到用户表
|
# 将最新的token保存到用户表
|
||||||
Users.objects.filter(id=self.user.id).update(last_token=data.get('refresh'))
|
Users.objects.filter(id=self.user.id).update(last_token=data.get('refresh'))
|
||||||
return {"code": 2000, "msg": "请求成功", "data": data}
|
return {"code": 2000, "msg": "请求成功", "data": data}
|
||||||
|
|
||||||
|
class CustomTokenRefreshView(TokenRefreshView):
|
||||||
|
"""
|
||||||
|
自定义token刷新
|
||||||
|
"""
|
||||||
|
def post(self, request, *args, **kwargs):
|
||||||
|
refresh_token = request.data.get("refresh")
|
||||||
|
try:
|
||||||
|
token = RefreshToken(refresh_token)
|
||||||
|
data = {
|
||||||
|
"access":str(token.access_token),
|
||||||
|
"refresh":str(token)
|
||||||
|
}
|
||||||
|
except:
|
||||||
|
return ErrorResponse(status=HTTP_401_UNAUTHORIZED)
|
||||||
|
return DetailResponse(data=data)
|
||||||
|
|
||||||
class LoginView(TokenObtainPairView):
|
class LoginView(TokenObtainPairView):
|
||||||
"""
|
"""
|
||||||
|
@ -156,6 +175,7 @@ class LoginTokenView(TokenObtainPairView):
|
||||||
|
|
||||||
class LogoutView(APIView):
|
class LogoutView(APIView):
|
||||||
def post(self, request):
|
def post(self, request):
|
||||||
|
Users.objects.filter(id=self.request.user.id).update(last_token=None)
|
||||||
return DetailResponse(msg="注销成功")
|
return DetailResponse(msg="注销成功")
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -79,8 +79,8 @@ function createService () {
|
||||||
return dataAxios
|
return dataAxios
|
||||||
case 401:
|
case 401:
|
||||||
refreshTken().then(res => {
|
refreshTken().then(res => {
|
||||||
util.cookies.set('token', res.access)
|
util.cookies.set('token', res.data.access)
|
||||||
router.push({path:'/index'})
|
// router.push({path:'/index'})
|
||||||
})
|
})
|
||||||
break
|
break
|
||||||
case 404:
|
case 404:
|
||||||
|
|
|
@ -33,8 +33,7 @@ export default {
|
||||||
username,
|
username,
|
||||||
password,
|
password,
|
||||||
captcha,
|
captcha,
|
||||||
captchaKey,
|
captchaKey
|
||||||
refresh: util.cookies.get('refresh') || null
|
|
||||||
})
|
})
|
||||||
// 设置 cookie 一定要存 uuid 和 token 两个 cookie
|
// 设置 cookie 一定要存 uuid 和 token 两个 cookie
|
||||||
// 整个系统依赖这两个数据进行校验和存储
|
// 整个系统依赖这两个数据进行校验和存储
|
||||||
|
|
Loading…
Reference in New Issue