gozero 实现产品设计-权限管理体系(跨系统权限管理)、数据权限、功能权限

465 阅读6分钟

实现一个权限管理体系,特别是在跨系统权限管理、数据权限和功能权限方面,使用 go-zero 框架可以帮助你构建一个高效、可扩展、可维护的系统。下面我将从设计角度和具体实现代码两个方面展开,帮助你了解如何使用 go-zero 完成权限管理体系的实现。

image.png

一、权限管理体系的设计

1. 权限管理体系分层设计

权限管理体系通常包括以下几个主要部分:

  • 用户权限管理:定义用户在系统中的角色、权限、资源访问控制。
  • 功能权限管理:限制用户对不同功能模块的访问权限。
  • 数据权限管理:根据用户权限控制用户对数据的访问,可能包括数据级别的权限控制。
  • 跨系统权限管理:在多个子系统之间统一管理和授权权限,保证权限一致性。

image.png 基于这个需求,我们可以采用分层设计来实现:

  1. 权限管理系统的主要功能

    • 用户管理(角色、用户与权限分配)
    • 功能权限(定义功能模块与权限)
    • 数据权限(用户对特定数据的操作权限)
    • 跨系统权限(统一多系统的权限控制)
  2. 权限模型

    • 用户:用户是进行权限控制的主体。
    • 角色:角色是权限的集合,一个用户可以拥有多个角色。
    • 功能权限:定义系统中每个模块(功能)的权限。
    • 数据权限:对数据的访问权限控制,可以根据用户、角色、数据的关系来控制。
    • 跨系统权限:允许不同子系统之间共享和管理权限。

image.png

2. 权限管理的主要模块

  1. 角色管理:管理系统中的角色,定义角色的权限。
  2. 用户管理:用户与角色、权限的绑定。
  3. 权限控制:控制用户对系统功能和数据的访问。
  4. 跨系统权限:在多个系统间共享和传递用户的权限信息。

image.png

二、具体实现

以下是基于 go-zero 框架的实现代码,重点展示如何实现角色权限管理、数据权限控制以及跨系统权限控制。

1. 权限模型设计

package model

// Role 角色模型
type Role struct {
	ID          int64  `json:"id"`
	Name        string `json:"name"`
	Description string `json:"description"`
}

// Permission 功能权限模型
type Permission struct {
	ID          int64  `json:"id"`
	Module      string `json:"module"`  // 模块名称
	Action      string `json:"action"`  // 操作权限 (例如: "create", "read", "update", "delete")
	Description string `json:"description"`
}

// User 用户模型
type User struct {
	ID       int64  `json:"id"`
	Username string `json:"username"`
	Password string `json:"password"`
	RoleID   int64  `json:"role_id"`
}

// DataPermission 数据权限模型
type DataPermission struct {
	ID         int64 `json:"id"`
	UserID     int64 `json:"user_id"`
	ResourceID int64 `json:"resource_id"`
	Action     string `json:"action"` // 操作权限
}

2. 角色和权限管理逻辑层

image.png

  • 角色管理:通过角色控制对功能模块的访问。
  • 权限管理:为每个角色配置其能够访问的功能模块及具体操作权限。

image.png

package logic

import (
	"fmt"
	"github.com/your_project/model"
	"github.com/your_project/utils"
	"github.com/your_project/service"
	"github.com/zeromicro/go-zero/core/logx"
)

// RoleLogic 角色管理逻辑
type RoleLogic struct {
	service service.RoleService
}

func NewRoleLogic(service service.RoleService) *RoleLogic {
	return &RoleLogic{service: service}
}

// 创建角色
func (logic *RoleLogic) CreateRole(role model.Role) (*model.Role, error) {
	// 处理创建角色的业务逻辑
	createdRole, err := logic.service.CreateRole(role)
	if err != nil {
		logx.Errorf("Create role failed: %v", err)
		return nil, err
	}
	return createdRole, nil
}

// 给角色分配权限
func (logic *RoleLogic) AssignPermissionsToRole(roleID int64, permissions []model.Permission) error {
	// 处理权限分配的业务逻辑
	err := logic.service.AssignPermissions(roleID, permissions)
	if err != nil {
		logx.Errorf("Assign permissions failed: %v", err)
		return err
	}
	return nil
}

// 获取角色权限
func (logic *RoleLogic) GetRolePermissions(roleID int64) ([]model.Permission, error) {
	permissions, err := logic.service.GetRolePermissions(roleID)
	if err != nil {
		logx.Errorf("Get role permissions failed: %v", err)
		return nil, err
	}
	return permissions, nil
}

image.png

3. 跨系统权限管理

跨系统权限管理的核心是统一权限认证和授权。在跨系统场景下,我们通常需要使用一个统一的身份认证平台,所有子系统通过该平台获取用户的权限。

  • 用户在一个中心系统中登录,登录成功后通过单点登录(SSO)机制获取该用户在其他子系统中的权限。
  • 可以使用 OAuth、JWT 或其他认证机制进行跨系统权限控制。
package service

import (
	"github.com/your_project/model"
	"github.com/your_project/utils"
	"github.com/zeromicro/go-zero/core/logx"
)

// RoleService 服务层,封装角色与权限相关的操作
type RoleService struct {
	// 数据库连接等
}

// 创建角色
func (service *RoleService) CreateRole(role model.Role) (*model.Role, error) {
	// 插入角色数据到数据库
	// 假设使用数据库或缓存存储角色信息
	logx.Infof("Role created: %v", role)
	return &role, nil
}

// 给角色分配权限
func (service *RoleService) AssignPermissions(roleID int64, permissions []model.Permission) error {
	// 分配角色权限
	// 假设在数据库中插入相关权限数据
	logx.Infof("Permissions assigned to role: %v", permissions)
	return nil
}

// 获取角色权限
func (service *RoleService) GetRolePermissions(roleID int64) ([]model.Permission, error) {
	// 从数据库中获取权限数据
	permissions := []model.Permission{
		{ID: 1, Module: "user", Action: "read", Description: "查看用户信息"},
		{ID: 2, Module: "user", Action: "update", Description: "修改用户信息"},
	}
	logx.Infof("Fetched permissions for role: %v", permissions)
	return permissions, nil
}

4. 数据权限管理

数据权限控制通常通过为用户设置数据级别的访问权限来实现。比如,用户只能访问与其权限关联的数据。

package logic

import (
	"github.com/your_project/model"
	"github.com/your_project/service"
	"github.com/zeromicro/go-zero/core/logx"
)

// DataPermissionLogic 数据权限管理逻辑
type DataPermissionLogic struct {
	service service.DataPermissionService
}

func NewDataPermissionLogic(service service.DataPermissionService) *DataPermissionLogic {
	return &DataPermissionLogic{service: service}
}

// 分配数据权限
func (logic *DataPermissionLogic) AssignDataPermissions(userID int64, permissions []model.DataPermission) error {
	err := logic.service.AssignDataPermissions(userID, permissions)
	if err != nil {
		logx.Errorf("Assign data permissions failed: %v", err)
		return err
	}
	return nil
}

// 获取用户的数据权限
func (logic *DataPermissionLogic) GetUserDataPermissions(userID int64) ([]model.DataPermission, error) {
	permissions, err := logic.service.GetUserDataPermissions(userID)
	if err != nil {
		logx.Errorf("Get data permissions failed: %v", err)
		return nil, err
	}
	return permissions, nil
}

5. 权限控制拦截器

在系统中,对功能的权限访问进行控制通常通过中间件或拦截器来实现。例如,可以创建一个拦截器来检查用户是否具有某个功能的访问权限。

package middleware

import (
	"net/http"
	"github.com/zeromicro/go-zero/rest/httpx"
	"github.com/your_project/service"
	"github.com/your_project/model"
)

func PermissionInterceptor(permissionService *service.PermissionService) http.HandlerFunc {
	return func(w http.ResponseWriter, r *http.Request) {
		userID := r.Header.Get("user_id")
		// 检查用户是否具有该功能的权限
		hasPermission, err := permissionService.CheckUserPermission(userID, "read_user")
		if err != nil || !hasPermission {
			httpx.Error(w, fmt.Errorf("no permission"))
			return
		}
		// 如果有权限,继续请求
		httpx.OkJson(w, model.APIResponse{
			Code:    0,
			Message: "Permission granted",
		})
	}
}

image.png

三、总结

  1. 角色管理与权限分配:通过将角色与功能权限关联,灵活控制不同角色访问不同的功能。
  2. 数据权限控制:通过对数据的细粒度访问控制,确保不同用户仅能访问自己有权限的数据。
  3. 跨系统权限管理:通过统一的权限管理系统,保障多个子系统之间的权限一致性。
  4. 权限控制拦截器:通过在请求拦截时校验用户的权限,确保系统的安全性。

这种设计方式使得权限管理既灵活又清晰,能够有效管理跨系统的权限、功能和数据权限,确保系统的安全性和可维护性。