mirror of https://github.com/jumpserver/jumpserver
				
				
				
			perf: 不允许修改自己的角色
							parent
							
								
									f9a7a95191
								
							
						
					
					
						commit
						9634f397df
					
				|  | @ -6,7 +6,7 @@ from itertools import chain | ||||||
| from django.db import models | from django.db import models | ||||||
| from rest_framework.settings import api_settings | from rest_framework.settings import api_settings | ||||||
| 
 | 
 | ||||||
| from common.drf.filters import IDSpmFilter, CustomFilter, IDInFilter | from common.drf.filters import IDSpmFilter, CustomFilter, IDInFilter, IDNotFilter | ||||||
| 
 | 
 | ||||||
| __all__ = ['ExtraFilterFieldsMixin', 'OrderingFielderFieldsMixin'] | __all__ = ['ExtraFilterFieldsMixin', 'OrderingFielderFieldsMixin'] | ||||||
| 
 | 
 | ||||||
|  | @ -17,7 +17,7 @@ class ExtraFilterFieldsMixin: | ||||||
|     """ |     """ | ||||||
|     额外的 api filter |     额外的 api filter | ||||||
|     """ |     """ | ||||||
|     default_added_filters = [CustomFilter, IDSpmFilter, IDInFilter] |     default_added_filters = [CustomFilter, IDSpmFilter, IDInFilter, IDNotFilter] | ||||||
|     filter_backends = api_settings.DEFAULT_FILTER_BACKENDS |     filter_backends = api_settings.DEFAULT_FILTER_BACKENDS | ||||||
|     extra_filter_fields = [] |     extra_filter_fields = [] | ||||||
|     extra_filter_backends = [] |     extra_filter_backends = [] | ||||||
|  |  | ||||||
|  | @ -13,17 +13,16 @@ from rest_framework.fields import DateTimeField | ||||||
| from rest_framework.serializers import ValidationError | from rest_framework.serializers import ValidationError | ||||||
| 
 | 
 | ||||||
| from common import const | from common import const | ||||||
|  | from common.db.fields import RelatedManager | ||||||
| 
 | 
 | ||||||
| logger = logging.getLogger('jumpserver.common') | logger = logging.getLogger('jumpserver.common') | ||||||
| 
 | 
 | ||||||
| __all__ = [ | __all__ = [ | ||||||
|     "DatetimeRangeFilter", "IDSpmFilter", |     "DatetimeRangeFilter", "IDSpmFilter", | ||||||
|     'IDInFilter', "CustomFilter", |     'IDInFilter', "CustomFilter", | ||||||
|     "BaseFilterSet" |     "BaseFilterSet", 'IDNotFilter' | ||||||
| ] | ] | ||||||
| 
 | 
 | ||||||
| from common.db.fields import RelatedManager |  | ||||||
| 
 |  | ||||||
| 
 | 
 | ||||||
| class BaseFilterSet(drf_filters.FilterSet): | class BaseFilterSet(drf_filters.FilterSet): | ||||||
|     def do_nothing(self, queryset, name, value): |     def do_nothing(self, queryset, name, value): | ||||||
|  | @ -149,6 +148,25 @@ class IDInFilter(filters.BaseFilterBackend): | ||||||
|         return queryset |         return queryset | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | class IDNotFilter(filters.BaseFilterBackend): | ||||||
|  |     def get_schema_fields(self, view): | ||||||
|  |         return [ | ||||||
|  |             coreapi.Field( | ||||||
|  |                 name='id!', location='query', required=False, | ||||||
|  |                 type='string', example='/api/v1/users/users?id!=1,2,3', | ||||||
|  |                 description='Exclude by id set' | ||||||
|  |             ) | ||||||
|  |         ] | ||||||
|  | 
 | ||||||
|  |     def filter_queryset(self, request, queryset, view): | ||||||
|  |         ids = request.query_params.get('id!') | ||||||
|  |         if not ids: | ||||||
|  |             return queryset | ||||||
|  |         id_list = [i.strip() for i in ids.split(',')] | ||||||
|  |         queryset = queryset.exclude(id__in=id_list) | ||||||
|  |         return queryset | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| class CustomFilter(filters.BaseFilterBackend): | class CustomFilter(filters.BaseFilterBackend): | ||||||
| 
 | 
 | ||||||
|     def get_schema_fields(self, view): |     def get_schema_fields(self, view): | ||||||
|  |  | ||||||
|  | @ -14,7 +14,7 @@ class UserUserGroupRelationViewSet(JMSBulkRelationModelViewSet): | ||||||
|     perm_model = UserGroup |     perm_model = UserGroup | ||||||
|     filterset_fields = ('user', 'usergroup') |     filterset_fields = ('user', 'usergroup') | ||||||
|     search_fields = filterset_fields |     search_fields = filterset_fields | ||||||
|     serializer_class = serializers.UserUserGroupRelationSerializer |     serializer_class = serializers.User2GroupRelationSerializer | ||||||
|     m2m_field = User.groups.field |     m2m_field = User.groups.field | ||||||
| 
 | 
 | ||||||
|     def get_queryset(self): |     def get_queryset(self): | ||||||
|  |  | ||||||
|  | @ -4,15 +4,16 @@ from rest_framework import serializers | ||||||
| 
 | 
 | ||||||
| from ..models import User | from ..models import User | ||||||
| 
 | 
 | ||||||
| __all__ = ['UserUserGroupRelationSerializer'] | __all__ = ['User2GroupRelationSerializer'] | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class UserUserGroupRelationSerializer(serializers.ModelSerializer): | class User2GroupRelationSerializer(serializers.ModelSerializer): | ||||||
|     user_display = serializers.CharField(read_only=True) |     user_display = serializers.CharField(read_only=True) | ||||||
|     usergroup_display = serializers.CharField(read_only=True) |     usergroup_display = serializers.CharField(read_only=True) | ||||||
| 
 | 
 | ||||||
|     class Meta: |     class Meta: | ||||||
|         model = User.groups.through |         model = User.groups.through | ||||||
|         fields = [ |         fields = [ | ||||||
|             'id', 'user', 'user_display', 'usergroup', 'usergroup_display' |             'id', 'user', 'user_display', | ||||||
|  |             'usergroup', 'usergroup_display' | ||||||
|         ] |         ] | ||||||
|  |  | ||||||
|  | @ -56,15 +56,16 @@ class RolesSerializerMixin(serializers.Serializer): | ||||||
|         if request.user.is_anonymous: |         if request.user.is_anonymous: | ||||||
|             return fields |             return fields | ||||||
| 
 | 
 | ||||||
|         action = view.action or "list" |  | ||||||
|         if action in ("partial_bulk_update", "bulk_update", "partial_update", "update"): |  | ||||||
|             action = "create" |  | ||||||
| 
 |  | ||||||
|         model_cls_field_mapper = { |         model_cls_field_mapper = { | ||||||
|             SystemRoleBinding: ["system_roles"], |             SystemRoleBinding: ["system_roles"], | ||||||
|             OrgRoleBinding: ["org_roles"], |             OrgRoleBinding: ["org_roles"], | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  |         update_actions = ("partial_bulk_update", "bulk_update", "partial_update", "update") | ||||||
|  |         action = view.action or "list" | ||||||
|  |         if action in update_actions: | ||||||
|  |             action = "create" | ||||||
|  | 
 | ||||||
|         for model_cls, fields_names in model_cls_field_mapper.items(): |         for model_cls, fields_names in model_cls_field_mapper.items(): | ||||||
|             perms = RBACPermission.parse_action_model_perms(action, model_cls) |             perms = RBACPermission.parse_action_model_perms(action, model_cls) | ||||||
|             if request.user.has_perms(perms): |             if request.user.has_perms(perms): | ||||||
|  | @ -156,7 +157,7 @@ class UserSerializer(RolesSerializerMixin, CommonBulkSerializerMixin, serializer | ||||||
|             "is_first_login", "wecom_id", "dingtalk_id", |             "is_first_login", "wecom_id", "dingtalk_id", | ||||||
|             "feishu_id", |             "feishu_id", | ||||||
|         ] |         ] | ||||||
|         disallow_self_update_fields = ["is_active"] |         disallow_self_update_fields = ["is_active", "system_roles", "org_roles"] | ||||||
|         extra_kwargs = { |         extra_kwargs = { | ||||||
|             "password": { |             "password": { | ||||||
|                 "write_only": True, |                 "write_only": True, | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 ibuler
						ibuler