mirror of https://github.com/jumpserver/jumpserver
pref: 修改 connect token
parent
abfd472a0a
commit
0f35b3dd58
|
@ -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
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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):
|
||||||
|
|
|
@ -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'),
|
||||||
|
),
|
||||||
|
]
|
|
@ -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")
|
||||||
)
|
)
|
||||||
|
|
|
@ -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')
|
||||||
|
|
|
@ -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 |
Loading…
Reference in New Issue