mirror of
https://github.com/jumpserver/jumpserver.git
synced 2025-09-15 06:49:17 +00:00
perf: 解决Slack解绑用户404问题 (#12283)
Co-authored-by: jiangweidong <weidong.jiang@fit2cloud.com>
This commit is contained in:
@@ -4,7 +4,6 @@
|
||||
from .access_key import *
|
||||
from .confirm import *
|
||||
from .connection_token import *
|
||||
from .dingtalk import *
|
||||
from .feishu import *
|
||||
from .login_confirm import *
|
||||
from .mfa import *
|
||||
@@ -12,4 +11,4 @@ from .password import *
|
||||
from .sso import *
|
||||
from .temp_token import *
|
||||
from .token import *
|
||||
from .wecom import *
|
||||
from .common import *
|
||||
|
51
apps/authentication/api/common.py
Normal file
51
apps/authentication/api/common.py
Normal file
@@ -0,0 +1,51 @@
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
from rest_framework.request import Request
|
||||
from rest_framework.response import Response
|
||||
from rest_framework.views import APIView
|
||||
|
||||
from authentication import errors
|
||||
from authentication.const import ConfirmType
|
||||
from authentication.permissions import UserConfirmation
|
||||
from common.api import RoleUserMixin, RoleAdminMixin
|
||||
from common.exceptions import JMSException
|
||||
from common.permissions import IsValidUser, OnlySuperUser
|
||||
from common.utils import get_logger
|
||||
from users.models import User
|
||||
|
||||
|
||||
logger = get_logger(__file__)
|
||||
|
||||
|
||||
class QRUnBindBase(APIView):
|
||||
user: User
|
||||
|
||||
def post(self, request: Request, backend: str, **kwargs):
|
||||
backend_map = {
|
||||
'wecom': {'user_field': 'wecom_id', 'not_bind_err': errors.WeComNotBound},
|
||||
'dingtalk': {'user_field': 'dingtalk_id', 'not_bind_err': errors.DingTalkNotBound},
|
||||
'feishu': {'user_field': 'feishu_id', 'not_bind_err': errors.FeiShuNotBound},
|
||||
'slack': {'user_field': 'slack_id', 'not_bind_err': errors.SlackNotBound},
|
||||
}
|
||||
user = self.user
|
||||
|
||||
backend_info = backend_map.get(backend)
|
||||
if not backend_info:
|
||||
raise JMSException(
|
||||
_('The value in the parameter must contain %s') % ', '.join(backend_map.keys())
|
||||
)
|
||||
|
||||
if not getattr(user, backend_info['user_field'], None):
|
||||
raise backend_info['not_bind_err']
|
||||
|
||||
setattr(user, backend_info['user_field'], None)
|
||||
user.save()
|
||||
return Response()
|
||||
|
||||
|
||||
class QRUnBindForUserApi(RoleUserMixin, QRUnBindBase):
|
||||
permission_classes = (IsValidUser, UserConfirmation.require(ConfirmType.RELOGIN),)
|
||||
|
||||
|
||||
class QRUnBindForAdminApi(RoleAdminMixin, QRUnBindBase):
|
||||
permission_classes = (OnlySuperUser,)
|
||||
user_id_url_kwarg = 'user_id'
|
@@ -1,35 +0,0 @@
|
||||
from rest_framework.request import Request
|
||||
from rest_framework.response import Response
|
||||
from rest_framework.views import APIView
|
||||
|
||||
from authentication import errors
|
||||
from authentication.const import ConfirmType
|
||||
from authentication.permissions import UserConfirmation
|
||||
from common.api import RoleUserMixin, RoleAdminMixin
|
||||
from common.permissions import IsValidUser
|
||||
from common.utils import get_logger
|
||||
from users.models import User
|
||||
|
||||
logger = get_logger(__file__)
|
||||
|
||||
|
||||
class DingTalkQRUnBindBase(APIView):
|
||||
user: User
|
||||
|
||||
def post(self, request: Request, **kwargs):
|
||||
user = self.user
|
||||
|
||||
if not user.dingtalk_id:
|
||||
raise errors.DingTalkNotBound
|
||||
|
||||
user.dingtalk_id = None
|
||||
user.save()
|
||||
return Response()
|
||||
|
||||
|
||||
class DingTalkQRUnBindForUserApi(RoleUserMixin, DingTalkQRUnBindBase):
|
||||
permission_classes = (IsValidUser, UserConfirmation.require(ConfirmType.RELOGIN),)
|
||||
|
||||
|
||||
class DingTalkQRUnBindForAdminApi(RoleAdminMixin, DingTalkQRUnBindBase):
|
||||
user_id_url_kwarg = 'user_id'
|
@@ -2,39 +2,13 @@ from rest_framework.request import Request
|
||||
from rest_framework.response import Response
|
||||
from rest_framework.views import APIView
|
||||
|
||||
from authentication import errors
|
||||
from authentication.const import ConfirmType
|
||||
from authentication.permissions import UserConfirmation
|
||||
from common.api import RoleUserMixin, RoleAdminMixin
|
||||
from common.permissions import IsValidUser
|
||||
from common.utils import get_logger
|
||||
from users.models import User
|
||||
|
||||
|
||||
logger = get_logger(__name__)
|
||||
|
||||
|
||||
class FeiShuQRUnBindBase(APIView):
|
||||
user: User
|
||||
|
||||
def post(self, request: Request, **kwargs):
|
||||
user = self.user
|
||||
|
||||
if not user.feishu_id:
|
||||
raise errors.FeiShuNotBound
|
||||
|
||||
user.feishu_id = None
|
||||
user.save()
|
||||
return Response()
|
||||
|
||||
|
||||
class FeiShuQRUnBindForUserApi(RoleUserMixin, FeiShuQRUnBindBase):
|
||||
permission_classes = (IsValidUser, UserConfirmation.require(ConfirmType.RELOGIN),)
|
||||
|
||||
|
||||
class FeiShuQRUnBindForAdminApi(RoleAdminMixin, FeiShuQRUnBindBase):
|
||||
user_id_url_kwarg = 'user_id'
|
||||
|
||||
|
||||
class FeiShuEventSubscriptionCallback(APIView):
|
||||
"""
|
||||
# https://open.feishu.cn/document/ukTMukTMukTM/uUTNz4SN1MjL1UzM
|
||||
|
@@ -1,35 +0,0 @@
|
||||
from rest_framework.request import Request
|
||||
from rest_framework.response import Response
|
||||
from rest_framework.views import APIView
|
||||
|
||||
from authentication import errors
|
||||
from authentication.const import ConfirmType
|
||||
from authentication.permissions import UserConfirmation
|
||||
from common.api import RoleUserMixin, RoleAdminMixin
|
||||
from common.permissions import IsValidUser
|
||||
from common.utils import get_logger
|
||||
from users.models import User
|
||||
|
||||
logger = get_logger(__file__)
|
||||
|
||||
|
||||
class WeComQRUnBindBase(APIView):
|
||||
user: User
|
||||
|
||||
def post(self, request: Request, **kwargs):
|
||||
user = self.user
|
||||
|
||||
if not user.wecom_id:
|
||||
raise errors.WeComNotBound
|
||||
|
||||
user.wecom_id = None
|
||||
user.save()
|
||||
return Response()
|
||||
|
||||
|
||||
class WeComQRUnBindForUserApi(RoleUserMixin, WeComQRUnBindBase):
|
||||
permission_classes = (IsValidUser, UserConfirmation.require(ConfirmType.RELOGIN),)
|
||||
|
||||
|
||||
class WeComQRUnBindForAdminApi(RoleAdminMixin, WeComQRUnBindBase):
|
||||
user_id_url_kwarg = 'user_id'
|
@@ -33,6 +33,11 @@ class FeiShuNotBound(JMSException):
|
||||
default_detail = _('FeiShu is not bound')
|
||||
|
||||
|
||||
class SlackNotBound(JMSException):
|
||||
default_code = 'slack_not_bound'
|
||||
default_detail = _('Slack is not bound')
|
||||
|
||||
|
||||
class PasswordInvalid(JMSException):
|
||||
default_code = 'passwd_invalid'
|
||||
default_detail = _('Your password is invalid')
|
||||
|
@@ -16,16 +16,9 @@ router.register('super-connection-token', api.SuperConnectionTokenViewSet, 'supe
|
||||
router.register('confirm', api.UserConfirmationViewSet, 'confirm')
|
||||
|
||||
urlpatterns = [
|
||||
path('wecom/qr/unbind/', api.WeComQRUnBindForUserApi.as_view(), name='wecom-qr-unbind'),
|
||||
path('wecom/qr/unbind/<uuid:user_id>/', api.WeComQRUnBindForAdminApi.as_view(), name='wecom-qr-unbind-for-admin'),
|
||||
path('<str:backend>/qr/unbind/', api.QRUnBindForUserApi.as_view(), name='qr-unbind'),
|
||||
path('<str:backend>/qr/unbind/<uuid:user_id>/', api.QRUnBindForAdminApi.as_view(), name='qr-unbind-for-admin'),
|
||||
|
||||
path('dingtalk/qr/unbind/', api.DingTalkQRUnBindForUserApi.as_view(), name='dingtalk-qr-unbind'),
|
||||
path('dingtalk/qr/unbind/<uuid:user_id>/', api.DingTalkQRUnBindForAdminApi.as_view(),
|
||||
name='dingtalk-qr-unbind-for-admin'),
|
||||
|
||||
path('feishu/qr/unbind/', api.FeiShuQRUnBindForUserApi.as_view(), name='feishu-qr-unbind'),
|
||||
path('feishu/qr/unbind/<uuid:user_id>/', api.FeiShuQRUnBindForAdminApi.as_view(),
|
||||
name='feishu-qr-unbind-for-admin'),
|
||||
path('feishu/event/subscription/callback/', api.FeiShuEventSubscriptionCallback.as_view(),
|
||||
name='feishu-event-subscription-callback'),
|
||||
|
||||
|
Reference in New Issue
Block a user