app端密钥登录

This commit is contained in:
曹前明 2022-08-04 17:09:44 +08:00
parent ed30c84cdc
commit ed68baca62
7 changed files with 65 additions and 5 deletions

View File

@ -22,4 +22,9 @@ class WxCodeSerializer(serializers.Serializer):
class PwResetSerializer(serializers.Serializer): class PwResetSerializer(serializers.Serializer):
phone = serializers.CharField(label="手机号") phone = serializers.CharField(label="手机号")
code = serializers.CharField(label="验证码") code = serializers.CharField(label="验证码")
password = serializers.CharField(label="新密码") password = serializers.CharField(label="新密码")
class SecretLoginSerializer(serializers.Serializer):
username = serializers.CharField(label="用户名")
secret = serializers.CharField(label="密钥")

View File

@ -3,7 +3,7 @@ from django.urls import path
from rest_framework_simplejwt.views import (TokenObtainPairView, from rest_framework_simplejwt.views import (TokenObtainPairView,
TokenRefreshView) TokenRefreshView)
from apps.auth1.views import CodeLogin, LoginView, LogoutView, PwResetView, SendCode, TokenBlackView, WxLogin, WxmpLogin from apps.auth1.views import CodeLogin, LoginView, LogoutView, PwResetView, SecretLogin, SendCode, TokenBlackView, WxLogin, WxmpLogin
API_BASE_URL = 'api/auth/' API_BASE_URL = 'api/auth/'
urlpatterns = [ urlpatterns = [
@ -11,6 +11,7 @@ urlpatterns = [
path(API_BASE_URL + 'token/refresh/', TokenRefreshView.as_view(), name='token_refresh'), path(API_BASE_URL + 'token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
path(API_BASE_URL + 'token/black/', TokenBlackView.as_view(), name='token_black'), path(API_BASE_URL + 'token/black/', TokenBlackView.as_view(), name='token_black'),
path(API_BASE_URL + 'login/', LoginView.as_view(), name='session_login'), path(API_BASE_URL + 'login/', LoginView.as_view(), name='session_login'),
path(API_BASE_URL + 'login_secret/', SecretLogin.as_view(), name='secret_login'),
path(API_BASE_URL + 'login_wxmp/', WxmpLogin.as_view(), name='login_wxmp'), path(API_BASE_URL + 'login_wxmp/', WxmpLogin.as_view(), name='login_wxmp'),
path(API_BASE_URL + 'login_wx/', WxLogin.as_view(), name='login_wx'), path(API_BASE_URL + 'login_wx/', WxLogin.as_view(), name='login_wx'),
path(API_BASE_URL + 'login_sms_code/', CodeLogin.as_view(), name='login_sms_code'), path(API_BASE_URL + 'login_sms_code/', CodeLogin.as_view(), name='login_sms_code'),

View File

@ -19,9 +19,10 @@ from apps.utils.tools import rannum
from apps.utils.wxmp import wxmpClient from apps.utils.wxmp import wxmpClient
from apps.utils.wx import wxClient from apps.utils.wx import wxClient
from django.contrib.auth.hashers import make_password from django.contrib.auth.hashers import make_password
from django.db.models import Q
from apps.auth1.serializers import CodeLoginSerializer, LoginSerializer, PwResetSerializer, SendCodeSerializer, WxCodeSerializer from apps.auth1.serializers import CodeLoginSerializer, LoginSerializer, PwResetSerializer, SecretLoginSerializer, SendCodeSerializer, WxCodeSerializer
from apps.system.models import User from apps.system.models import User
from apps.utils.viewsets import CustomGenericViewSet, CustomModelViewSet from apps.utils.viewsets import CustomGenericViewSet, CustomModelViewSet
@ -176,6 +177,26 @@ class CodeLogin(CreateAPIView):
raise ParseError('账户不存在或已禁用') raise ParseError('账户不存在或已禁用')
class SecretLogin(CreateAPIView):
"""App端密钥登录
App端密钥登录
"""
authentication_classes = []
permission_classes = []
serializer_class = SecretLoginSerializer
def post(self, request):
username = request.data['username']
secret = request.data['secret']
user = User.objects.filter(Q(username=username) | Q(phone=username) | Q(
employee__id_number=username)).filter(secret=secret).first()
if user:
ret = get_tokens_for_user(user)
return Response(ret)
raise ParseError('登录失败')
class PwResetView(CreateAPIView): class PwResetView(CreateAPIView):
"""重置密码 """重置密码
@ -195,4 +216,4 @@ class PwResetView(CreateAPIView):
user.password = make_password(vdata['password']) user.password = make_password(vdata['password'])
user.save() user.save()
return Response() return Response()
raise ParseError('账户不存在或已禁用') raise ParseError('账户不存在或已禁用')

View File

@ -0,0 +1,18 @@
# Generated by Django 3.2.12 on 2022-08-04 09:06
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('system', '0005_alter_userpost_post'),
]
operations = [
migrations.AddField(
model_name='user',
name='secret',
field=models.CharField(blank=True, max_length=100, null=True, verbose_name='密钥'),
),
]

View File

@ -135,6 +135,7 @@ class User(AbstractUser, CommonBModel):
roles = models.ManyToManyField(Role, verbose_name='关联角色') roles = models.ManyToManyField(Role, verbose_name='关联角色')
# 关联账号 # 关联账号
secret = models.CharField('密钥', max_length=100, null=True, blank=True)
wx_openid = models.CharField('微信公众号OpenId', max_length=100, null=True, blank=True) wx_openid = models.CharField('微信公众号OpenId', max_length=100, null=True, blank=True)
wx_nickname = models.CharField('微信昵称', max_length=100, null=True, blank=True) wx_nickname = models.CharField('微信昵称', max_length=100, null=True, blank=True)
wx_headimg = models.CharField('微信头像', max_length=100, null=True, blank=True) wx_headimg = models.CharField('微信头像', max_length=100, null=True, blank=True)

View File

@ -302,7 +302,7 @@ class UserListSerializer(CustomModelSerializer):
class Meta: class Meta:
model = User model = User
exclude = ['password'] exclude = ['password', 'secret']
# def phone_check(phone): # def phone_check(phone):
# re_phone = '^1[358]\d{9}$|^147\d{8}$|^176\d{8}$' # re_phone = '^1[358]\d{9}$|^147\d{8}$|^176\d{8}$'

View File

@ -262,6 +262,7 @@ class DictViewSet(CustomModelViewSet):
update_serializer_class = DictCreateUpdateSerializer update_serializer_class = DictCreateUpdateSerializer
partial_update_serializer_class = DictCreateUpdateSerializer partial_update_serializer_class = DictCreateUpdateSerializer
search_fields = ['name'] search_fields = ['name']
ordering = ['sort', 'create_time']
class PostViewSet(CustomModelViewSet): class PostViewSet(CustomModelViewSet):
@ -511,6 +512,19 @@ class UserViewSet(CustomModelViewSet):
user.wx_openid = openid user.wx_openid = openid
user.save() user.save()
return Response({'wx_openid': openid}) return Response({'wx_openid': openid})
@action(methods=['post'], detail=False, permission_classes=[IsAuthenticated])
def bind_secret(self, request, pk=None):
"""创建密钥
创建密钥
"""
secret = request.data['secret']
if secret:
user = request.user
user.secret = secret
user.save()
return Response()
class FileViewSet(CustomCreateModelMixin, RetrieveModelMixin, ListModelMixin, CustomGenericViewSet): class FileViewSet(CustomCreateModelMixin, RetrieveModelMixin, ListModelMixin, CustomGenericViewSet):