pref: 修改 connect token

pull/9123/head
ibuler 2022-11-25 23:09:55 +08:00
parent abfd472a0a
commit 0f35b3dd58
10 changed files with 67 additions and 30 deletions

View File

@ -68,9 +68,6 @@ class SerializeToTreeNodeMixin:
'data': { 'data': {
'id': asset.id, 'id': asset.id,
'name': asset.name, 'name': asset.name,
'address': asset.address,
'protocols': asset.protocols_as_list,
'platform': asset.platform.id,
'org_name': asset.org_name 'org_name': asset.org_name
}, },
} }

View File

@ -160,10 +160,6 @@ class Asset(NodesRelationMixin, AbsConnectivity, JMSOrgBaseModel):
return 0 return 0
return self.primary_protocol.port return self.primary_protocol.port
@property
def protocols_as_list(self):
return [{'name': p.name, 'port': p.port} for p in self.protocols.all()]
@lazyproperty @lazyproperty
def type(self): def type(self):
return self.platform.type return self.platform.type

View File

@ -15,8 +15,8 @@ from rest_framework.response import Response
from common.drf.api import JMSModelViewSet from common.drf.api import JMSModelViewSet
from common.http import is_true from common.http import is_true
from common.utils import random_string
from orgs.mixins.api import RootOrgViewMixin from orgs.mixins.api import RootOrgViewMixin
from orgs.utils import tmp_to_root_org
from perms.models import ActionChoices from perms.models import ActionChoices
from terminal.models import EndpointRule from terminal.models import EndpointRule
from ..models import ConnectionToken from ..models import ConnectionToken
@ -249,10 +249,6 @@ class ConnectionTokenViewSet(ExtraActionApiMixin, RootOrgViewMixin, JMSModelView
serializer = self.get_serializer(instance=token) serializer = self.get_serializer(instance=token)
return Response(serializer.data, status=status.HTTP_200_OK) return Response(serializer.data, status=status.HTTP_200_OK)
def dispatch(self, request, *args, **kwargs):
with tmp_to_root_org():
return super().dispatch(request, *args, **kwargs)
def get_queryset(self): def get_queryset(self):
return ConnectionToken.objects.filter(user=self.request.user) return ConnectionToken.objects.filter(user=self.request.user)
@ -269,16 +265,17 @@ class ConnectionTokenViewSet(ExtraActionApiMixin, RootOrgViewMixin, JMSModelView
data = serializer.validated_data data = serializer.validated_data
user = self.get_user(serializer) user = self.get_user(serializer)
asset = data.get('asset') asset = data.get('asset')
login = data.get('login') account_name = data.get('account_name')
data['org_id'] = asset.org_id data['org_id'] = asset.org_id
data['user'] = user data['user'] = user
data['value'] = random_string(16)
util = PermAccountUtil() util = PermAccountUtil()
permed_account = util.validate_permission(user, asset, login) permed_account = util.validate_permission(user, asset, account_name)
if not permed_account or not permed_account.actions: if not permed_account or not permed_account.actions:
msg = 'user `{}` not has asset `{}` permission for login `{}`'.format( msg = 'user `{}` not has asset `{}` permission for login `{}`'.format(
user, asset, login user, asset, account_name
) )
raise PermissionDenied(msg) raise PermissionDenied(msg)
@ -286,9 +283,9 @@ class ConnectionTokenViewSet(ExtraActionApiMixin, RootOrgViewMixin, JMSModelView
raise PermissionDenied('Expired') raise PermissionDenied('Expired')
if permed_account.has_secret: if permed_account.has_secret:
data['secret'] = '' data['input_secret'] = ''
if permed_account.username != '@INPUT': if permed_account.username != '@INPUT':
data['username'] = '' data['input_username'] = ''
return permed_account return permed_account

View File

View File

@ -2,10 +2,10 @@ from django.utils import timezone
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework.decorators import action from rest_framework.decorators import action
from rbac.permissions import RBACPermission
from common.drf.api import JMSModelViewSet from common.drf.api import JMSModelViewSet
from ..models import TempToken from ..models import TempToken
from ..serializers import TempTokenSerializer from ..serializers import TempTokenSerializer
from rbac.permissions import RBACPermission
class TempTokenViewSet(JMSModelViewSet): class TempTokenViewSet(JMSModelViewSet):

View File

@ -0,0 +1,49 @@
# Generated by Django 3.2.14 on 2022-11-25 14:40
import common.db.fields
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('authentication', '0014_auto_20221122_2152'),
]
operations = [
migrations.RenameField(
model_name='connectiontoken',
old_name='login',
new_name='account_name'
),
migrations.RenameField(
model_name='connectiontoken',
old_name='secret',
new_name='value',
),
migrations.RenameField(
model_name='connectiontoken',
old_name='username',
new_name='input_username',
),
migrations.AddField(
model_name='connectiontoken',
name='input_secret',
field=common.db.fields.EncryptCharField(default='', max_length=128, verbose_name='Input Secret'),
),
migrations.AlterField(
model_name='connectiontoken',
name='account_name',
field=models.CharField(max_length=128, verbose_name='Account name'),
),
migrations.AlterField(
model_name='connectiontoken',
name='input_username',
field=models.CharField(default='', max_length=128, verbose_name='Input Username'),
),
migrations.AlterField(
model_name='connectiontoken',
name='value',
field=models.CharField(default='', max_length=64, verbose_name='Value'),
),
]

View File

@ -19,6 +19,7 @@ def date_expired_default():
class ConnectionToken(OrgModelMixin, JMSBaseModel): class ConnectionToken(OrgModelMixin, JMSBaseModel):
value = models.CharField(max_length=64, default='', verbose_name=_("Value"))
user = models.ForeignKey( user = models.ForeignKey(
'users.User', on_delete=models.SET_NULL, null=True, blank=True, 'users.User', on_delete=models.SET_NULL, null=True, blank=True,
related_name='connection_tokens', verbose_name=_('User') related_name='connection_tokens', verbose_name=_('User')
@ -27,9 +28,9 @@ class ConnectionToken(OrgModelMixin, JMSBaseModel):
'assets.Asset', on_delete=models.SET_NULL, null=True, blank=True, 'assets.Asset', on_delete=models.SET_NULL, null=True, blank=True,
related_name='connection_tokens', verbose_name=_('Asset'), related_name='connection_tokens', verbose_name=_('Asset'),
) )
login = models.CharField(max_length=128, verbose_name=_("Login account")) account_name = models.CharField(max_length=128, verbose_name=_("Account name")) # 登录账号Name
username = models.CharField(max_length=128, default='', verbose_name=_("Username")) input_username = models.CharField(max_length=128, default='', verbose_name=_("Input Username"))
secret = EncryptCharField(max_length=64, default='', verbose_name=_("Secret")) input_secret = EncryptCharField(max_length=64, default='', verbose_name=_("Input Secret"))
protocol = models.CharField( protocol = models.CharField(
choices=Protocol.choices, max_length=16, default=Protocol.ssh, verbose_name=_("Protocol") choices=Protocol.choices, max_length=16, default=Protocol.ssh, verbose_name=_("Protocol")
) )

View File

@ -15,15 +15,14 @@ __all__ = [
class ConnectionTokenSerializer(OrgResourceModelSerializerMixin): class ConnectionTokenSerializer(OrgResourceModelSerializerMixin):
username = serializers.CharField(max_length=128, label=_("Input username"),
allow_null=True, allow_blank=True)
expire_time = serializers.IntegerField(read_only=True, label=_('Expired time')) expire_time = serializers.IntegerField(read_only=True, label=_('Expired time'))
class Meta: class Meta:
model = ConnectionToken model = ConnectionToken
fields_mini = ['id'] fields_mini = ['id', 'value']
fields_small = fields_mini + [ fields_small = fields_mini + [
'protocol', 'login', 'secret', 'username', 'protocol', 'account_name',
'input_username', 'input_secret',
'actions', 'date_expired', 'date_created', 'actions', 'date_expired', 'date_created',
'date_updated', 'created_by', 'date_updated', 'created_by',
'updated_by', 'org_id', 'org_name', 'updated_by', 'org_id', 'org_name',
@ -37,6 +36,9 @@ class ConnectionTokenSerializer(OrgResourceModelSerializerMixin):
'user_display', 'asset_display', 'user_display', 'asset_display',
] ]
fields = fields_small + fields_fk + read_only_fields fields = fields_small + fields_fk + read_only_fields
extra_kwargs = {
'value': {'read_only': True},
}
def get_request_user(self): def get_request_user(self):
request = self.context.get('request') request = self.context.get('request')

View File

@ -1,5 +0,0 @@
from rest_framework.viewsets import ModelViewSet
class PermTokenViewSet(ModelViewSet):
pass

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.1 KiB

After

Width:  |  Height:  |  Size: 4.9 KiB