Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[SaaS] 管理后台 -- 全局用户组管理 #751

Open
zhu327 opened this issue Feb 15, 2022 · 4 comments
Open

[SaaS] 管理后台 -- 全局用户组管理 #751

zhu327 opened this issue Feb 15, 2022 · 4 comments
Assignees
Labels
Layer: SaaS bk-iam-saas/saas Priority: Medium Sign: help wanted Extra attention is needed Size: M <=3 days Type: Enhancement New feature or request

Comments

@zhu327
Copy link
Member

zhu327 commented Feb 15, 2022

  1. 现有的用户组相关的方法, 迁移到管理后台
  2. 通过继承, 重写认证/鉴权, get_queryset等等方法来实现复用现有的代码
  3. 添加自定义权限/模板权限还是需要保证在分级管理员的范围内


梳理下现有的用户组管理功能

@zhu327 zhu327 added Type: Enhancement New feature or request Sign: help wanted Extra attention is needed Layer: SaaS bk-iam-saas/saas Priority: Medium Size: M <=3 days labels Feb 15, 2022
@zhu327 zhu327 self-assigned this Feb 15, 2022
@zhu327 zhu327 added this to To do in bk-iam 蓝鲸权限中心 via automation Feb 15, 2022
@Canway-shiisa
Copy link
Collaborator

【排期】
开发方案确定:1-2天;
开发:一周左右;

@Canway-shiisa
Copy link
Collaborator

【排期】
开发方案:20220414-20220415
开发:20220418-20220422

@Canway-shiisa
Copy link
Collaborator

思路
  • 在mgmt下增加 一个view,以group命名,用于实现全局管理用户组;

  • 继承saas/backebd/apps/group 下的用户组相关viewset

    【包括:

    GroupViewSet
    GroupMemberViewSet
    GroupMemberUpdateExpiredAtViewSet
    GroupTemplateViewSet
    GroupPolicyViewSet
    GroupSystemViewSet
    GroupTransferView
    GroupTemplateConditionCompareView
    GroupCustomPolicyConditionCompareView】

    =》

    1. 重写筛选方式,不对接口进行角色筛选

    2. 其中,添加自定义权限/模板权限 调用要限制属于分级管理员范围内

GroupViewSet
  • list:改写get_queryset 方法,不做角色筛选
from backend.apps.group.views import GroupViewSet

class GroupViewSet(GroupViewSet):	# 继承/apps/group下的GroupViewSet

    def get_queryset(self):
        return Group.objects.all()

    def list(self, request, *args, **kwargs):
        return super().list(request, *args, **kwargs)
  • retrieve:直接继承
    def retrieve(self, request, *args, **kwargs):
        return super().retrieve(request, *args, **kwargs)
  • create:正常在新建用户组时候需要进行角色下用户组名称唯一的校验,直接使用后台管理接口的话 这块要怎么处理呢?
  • update:根据直接要修改的用户组查询到关联的角色,根据角色信息来进行与角色相关的校验后再进行更新?
  • destory:直接继承
    @view_audit_decorator(GroupDeleteAuditProvider)
    def destroy(self, request, *args, **kwargs):
        return super().destroy(request, *args, **kwargs)
GroupMemberViewSet
  • list:去除校验权限
from backend.apps.group.views import GroupMemberViewSet

class GroupMemberViewSet(GroupMemberViewSet):	# 继承/apps/group下的GroupMemberViewSet
	def list(self, request, *args, **kwargs):
        group = get_object_or_404(self.queryset, pk=kwargs["id"])
        
        # 校验权限 (去除这部分校验)
        #checker = RoleObjectRelationChecker(request.role)
        #if not checker.check_group(group):
        #   raise error_codes.FORBIDDEN.format(message=_("用户组({})不在当前用户身份可访问的范围内").format(group.id), replace=True)

        if request.query_params.get("keyword"):
            slz = SearchMemberSLZ(data=request.query_params)
            slz.is_valid(raise_exception=True)
            keyword = slz.validated_data["keyword"].lower()

            group_members = self.biz.search_member_by_keyword(group.id, keyword)

            return Response({"results": [one.dict() for one in group_members]})

        pagination = LimitOffsetPagination()
        limit = pagination.get_limit(request)
        offset = pagination.get_offset(request)

        count, group_members = self.biz.list_paging_group_member(group.id, limit, offset)
        return Response({"count": count, "results": [one.dict() for one in group_members]})
  • create:去除管理授权范围的检测
    def create(self, request, *args, **kwargs):
        serializer = GroupAddMemberSLZ(data=request.data)
        serializer.is_valid(raise_exception=True)

        group = self.get_object()
        data = serializer.validated_data

        members_data = data["members"]
        expired_at = data["expired_at"]

        # 成员Dict结构转换为Subject结构,并去重
        members = list(set(parse_obj_as(List[Subject], members_data)))
        # 检测成员是否满足管理的授权范围
        # self.group_check_biz.check_role_subject_scope(request.role, members) 【不做该部分检测】       
        self.group_check_biz.check_member_count(group.id, len(members))

        permission_logger.info("group %s add members %s by user %s", group.id, members, request.user.username)

        # 添加成员
        self.biz.add_members(group.id, members, expired_at)

        # 写入审计上下文
        audit_context_setter(group=group, members=[m.dict() for m in members])

        return Response({}, status=status.HTTP_201_CREATED)
  • destroy:直接继承
    @view_audit_decorator(GroupMemberDeleteAuditProvider)
	def destroy(self, request, *args, **kwargs):
        return super().destroy(request, *args, **kwargs)

@zhu327
Copy link
Member Author

zhu327 commented Apr 15, 2022

  1. 授权还是需要保证权限的配置,成员在role的范围内
  2. 考虑下现有view中permission_classes相关的配置
  3. 本身继承过来的方法就有了, 再重复写没有意义
def list(self, request, *args, **kwargs):
        return super().list(request, *args, **kwargs)
  1. 管理后台不需要有create group的方法
  2. 产品上必须要考虑到修改用户组的权限时, 能选择到的权限数据,成员数据要在分级管理员的范围内,但是这个后台没有分级管理员的信息, 你要想办法把这部分的数据给到前端

Canway-shiisa added a commit to Canway-shiisa/bk-iam-saas that referenced this issue Jul 4, 2022
Canway-shiisa added a commit to Canway-shiisa/bk-iam-saas that referenced this issue Jul 4, 2022
Canway-shiisa added a commit to Canway-shiisa/bk-iam-saas that referenced this issue Jul 4, 2022
Canway-shiisa added a commit to Canway-shiisa/bk-iam-saas that referenced this issue Jul 4, 2022
Canway-shiisa added a commit to Canway-shiisa/bk-iam-saas that referenced this issue Jul 4, 2022
Canway-shiisa added a commit to Canway-shiisa/bk-iam-saas that referenced this issue Jul 5, 2022
Canway-shiisa added a commit to Canway-shiisa/bk-iam-saas that referenced this issue Jul 5, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Layer: SaaS bk-iam-saas/saas Priority: Medium Sign: help wanted Extra attention is needed Size: M <=3 days Type: Enhancement New feature or request
Development

No branches or pull requests

2 participants