mirror of https://github.com/jumpserver/jumpserver
				
				
				
			pref: 修改 perm token
							parent
							
								
									4f135bc349
								
							
						
					
					
						commit
						8e1312e8ce
					
				|  | @ -282,9 +282,6 @@ class ConnectionTokenViewSet(ExtraActionApiMixin, RootOrgViewMixin, JMSModelView | |||
|             raise PermissionDenied(error) | ||||
| 
 | ||||
| 
 | ||||
| # SuperConnectionToken | ||||
| 
 | ||||
| 
 | ||||
| class SuperConnectionTokenViewSet(ConnectionTokenViewSet): | ||||
|     serializer_classes = { | ||||
|         'default': SuperConnectionTokenSerializer, | ||||
|  |  | |||
|  | @ -1,14 +1,13 @@ | |||
| from django.utils.translation import ugettext_lazy as _ | ||||
| from rest_framework import serializers | ||||
| 
 | ||||
| from django.utils.translation import ugettext_lazy as _ | ||||
| from orgs.mixins.serializers import OrgResourceModelSerializerMixin | ||||
| from assets.models import Asset, Gateway, Domain, CommandFilterRule, Account, Platform | ||||
| from authentication.models import ConnectionToken | ||||
| from common.utils import pretty_string | ||||
| from common.utils.random import random_string | ||||
| from assets.models import Asset, Gateway, Domain, CommandFilterRule, Account | ||||
| from users.models import User | ||||
| from orgs.mixins.serializers import OrgResourceModelSerializerMixin | ||||
| from perms.serializers.permission import ActionChoicesField | ||||
| 
 | ||||
| from users.models import User | ||||
| 
 | ||||
| __all__ = [ | ||||
|     'ConnectionTokenSerializer', 'ConnectionTokenSecretSerializer', | ||||
|  | @ -86,7 +85,6 @@ class ConnectionTokenDisplaySerializer(ConnectionTokenSerializer): | |||
| 
 | ||||
| 
 | ||||
| class SuperConnectionTokenSerializer(ConnectionTokenSerializer): | ||||
| 
 | ||||
|     class Meta(ConnectionTokenSerializer.Meta): | ||||
|         read_only_fields = [ | ||||
|             'validity', 'user_display', 'system_user_display', | ||||
|  | @ -104,6 +102,7 @@ class SuperConnectionTokenSerializer(ConnectionTokenSerializer): | |||
| 
 | ||||
| class ConnectionTokenUserSerializer(serializers.ModelSerializer): | ||||
|     """ User """ | ||||
| 
 | ||||
|     class Meta: | ||||
|         model = User | ||||
|         fields = ['id', 'name', 'username', 'email'] | ||||
|  | @ -111,6 +110,7 @@ class ConnectionTokenUserSerializer(serializers.ModelSerializer): | |||
| 
 | ||||
| class ConnectionTokenAssetSerializer(serializers.ModelSerializer): | ||||
|     """ Asset """ | ||||
| 
 | ||||
|     class Meta: | ||||
|         model = Asset | ||||
|         fields = ['id', 'name', 'address', 'protocols', 'org_id'] | ||||
|  | @ -118,6 +118,7 @@ class ConnectionTokenAssetSerializer(serializers.ModelSerializer): | |||
| 
 | ||||
| class ConnectionTokenAccountSerializer(serializers.ModelSerializer): | ||||
|     """ Account """ | ||||
| 
 | ||||
|     class Meta: | ||||
|         model = Account | ||||
|         fields = [ | ||||
|  | @ -127,6 +128,7 @@ class ConnectionTokenAccountSerializer(serializers.ModelSerializer): | |||
| 
 | ||||
| class ConnectionTokenGatewaySerializer(serializers.ModelSerializer): | ||||
|     """ Gateway """ | ||||
| 
 | ||||
|     class Meta: | ||||
|         model = Gateway | ||||
|         fields = ['id', 'ip', 'port', 'username', 'password', 'private_key'] | ||||
|  | @ -143,6 +145,7 @@ class ConnectionTokenDomainSerializer(serializers.ModelSerializer): | |||
| 
 | ||||
| class ConnectionTokenCmdFilterRuleSerializer(serializers.ModelSerializer): | ||||
|     """ Command filter rule """ | ||||
| 
 | ||||
|     class Meta: | ||||
|         model = CommandFilterRule | ||||
|         fields = [ | ||||
|  | @ -151,12 +154,18 @@ class ConnectionTokenCmdFilterRuleSerializer(serializers.ModelSerializer): | |||
|         ] | ||||
| 
 | ||||
| 
 | ||||
| class ConnectionTokenPlatform(serializers.ModelSerializer): | ||||
|     class Meta: | ||||
|         model = Platform | ||||
|         fields = ['id', 'name', 'org_id'] | ||||
| 
 | ||||
| 
 | ||||
| class ConnectionTokenSecretSerializer(OrgResourceModelSerializerMixin): | ||||
|     user = ConnectionTokenUserSerializer(read_only=True) | ||||
|     asset = ConnectionTokenAssetSerializer(read_only=True) | ||||
|     platform = ConnectionTokenPlatform(read_only=True) | ||||
|     account = ConnectionTokenAccountSerializer(read_only=True) | ||||
|     gateway = ConnectionTokenGatewaySerializer(read_only=True) | ||||
|     domain = ConnectionTokenDomainSerializer(read_only=True) | ||||
|     cmd_filter_rules = ConnectionTokenCmdFilterRuleSerializer(many=True) | ||||
|     actions = ActionChoicesField() | ||||
|     expire_at = serializers.IntegerField() | ||||
|  |  | |||
|  | @ -27,6 +27,11 @@ class ActionChoices(BitChoices): | |||
|             (_("Clipboard"), [cls.copy, cls.paste]), | ||||
|         ) | ||||
| 
 | ||||
|     @classmethod | ||||
|     def has_perm(cls, action_name, total): | ||||
|         action_value = getattr(cls, action_name) | ||||
|         return action_value & total == action_value | ||||
| 
 | ||||
| 
 | ||||
| class SpecialAccount(models.TextChoices): | ||||
|     ALL = "@ALL", "All" | ||||
|  |  | |||
|  | @ -3,12 +3,19 @@ from django.utils.translation import gettext_lazy as _ | |||
| 
 | ||||
| 
 | ||||
| class PermToken(models.Model): | ||||
|     """ | ||||
|     1. 用完失效 | ||||
|     2. 仅用于授权,不用于认证 | ||||
|     3. 存 redis 就行 | ||||
|     4. 有效期 5 分钟 | ||||
|     """ | ||||
|     user = models.ForeignKey('users.User', on_delete=models.CASCADE, verbose_name=_('User')) | ||||
|     asset = models.ForeignKey('assets.Asset', on_delete=models.CASCADE, verbose_name=_('Asset')) | ||||
|     account = models.CharField(max_length=128, verbose_name=_('Account')) | ||||
|     secret = models.CharField(max_length=1024, verbose_name=_('Secret')) | ||||
|     protocol = models.CharField(max_length=32, verbose_name=_('Protocol')) | ||||
|     connect_method = models.CharField(max_length=32, verbose_name=_('Connect method')) | ||||
|     actions = models.IntegerField(verbose_name=_('Actions')) | ||||
| 
 | ||||
|     class Meta: | ||||
|         abstract = True | ||||
|  |  | |||
|  | @ -1,4 +1,3 @@ | |||
| import time | ||||
| from collections import defaultdict | ||||
| 
 | ||||
| from assets.models import Account | ||||
|  | @ -9,6 +8,7 @@ __all__ = ['PermAccountUtil'] | |||
| 
 | ||||
| class PermAccountUtil(AssetPermissionUtil): | ||||
|     """ 资产授权账号相关的工具 """ | ||||
| 
 | ||||
|     @staticmethod | ||||
|     def get_permed_accounts_from_perms(perms, user, asset): | ||||
|         alias_action_bit_mapper = defaultdict(int) | ||||
|  | @ -75,7 +75,9 @@ class PermAccountUtil(AssetPermissionUtil): | |||
|         return accounts | ||||
| 
 | ||||
|     def validate_permission(self, user, asset, account_username): | ||||
|         """ 校验用户有某个资产下某个账号名的权限 """ | ||||
|         """ 校验用户有某个资产下某个账号名的权限 | ||||
|         :param account_username: 可能是 @USER @INPUT 的 | ||||
|         """ | ||||
|         permed_accounts = self.get_permed_accounts_for_user(user, asset) | ||||
|         accounts_mapper = {account.username: account for account in permed_accounts} | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 ibuler
						ibuler