Bladeren bron

获取用户按钮权限

yxh 4 jaren geleden
bovenliggende
commit
1a8cd07652

+ 5 - 4
api/v1/system/user.go

@@ -13,8 +13,9 @@ type UserLoginReq struct {
 	VerifyKey  string `p:"verifyKey"`
 }
 type UserLoginRes struct {
-	g.Meta   `mime:"application/json" example:""`
-	UserInfo *model.LoginUserRes `json:"userInfo"`
-	Token    string              `json:"token"`
-	MenuList []*model.UserMenus  `json:"menuList"`
+	g.Meta      `mime:"application/json" example:""`
+	UserInfo    *model.LoginUserRes `json:"userInfo"`
+	Token       string              `json:"token"`
+	MenuList    []*model.UserMenus  `json:"menuList"`
+	Permissions []string            `json:"permissions"`
 }

+ 9 - 6
internal/app/system/controller/user.go

@@ -24,8 +24,10 @@ type UserController struct {
 
 func (c *UserController) Login(ctx context.Context, req *system.UserLoginReq) (res *system.UserLoginRes, err error) {
 	var (
-		user  *model.LoginUserRes
-		token string
+		user        *model.LoginUserRes
+		token       string
+		permissions []string
+		menuList    []*model.UserMenus
 	)
 	//判断验证码是否正确
 	debug := genv.GetWithCmd("gf.debug")
@@ -72,14 +74,15 @@ func (c *UserController) Login(ctx context.Context, req *system.UserLoginReq) (r
 		return
 	}
 	//获取用户菜单数据
-	menuList, err := service.User().GetAdminRules(ctx, user.Id)
+	menuList, permissions, err = service.User().GetAdminRules(ctx, user.Id)
 	if err != nil {
 		return
 	}
 	res = &system.UserLoginRes{
-		UserInfo: user,
-		Token:    token,
-		MenuList: menuList,
+		UserInfo:    user,
+		Token:       token,
+		MenuList:    menuList,
+		Permissions: permissions,
 	}
 	return
 }

+ 16 - 0
internal/app/system/service/sys_auth_rule.go

@@ -21,6 +21,7 @@ import (
 type IRule interface {
 	GetIsMenuStatusList(ctx context.Context) ([]*model.SysAuthRuleInfoRes, error)
 	GetMenuList(ctx context.Context) (list []*model.SysAuthRuleInfoRes, err error)
+	GetIsButtonStatusList(ctx context.Context) ([]*model.SysAuthRuleInfoRes, error)
 }
 
 type ruleImpl struct {
@@ -70,3 +71,18 @@ func (s *ruleImpl) getMenuListFromDb(ctx context.Context) (value interface{}, er
 	})
 	return
 }
+
+// GetIsButtonStatusList 获取所有按钮isMenu=2 且status=1的菜单列表
+func (s *ruleImpl) GetIsButtonStatusList(ctx context.Context) ([]*model.SysAuthRuleInfoRes, error) {
+	list, err := s.GetMenuList(ctx)
+	if err != nil {
+		return nil, err
+	}
+	var gList = make([]*model.SysAuthRuleInfoRes, 0, len(list))
+	for _, v := range list {
+		if v.MenuType == 2 && v.Status == 1 {
+			gList = append(gList, v)
+		}
+	}
+	return gList, nil
+}

+ 34 - 2
internal/app/system/service/sys_user.go

@@ -32,7 +32,7 @@ type IUser interface {
 	LoginLog(ctx context.Context, params *model.LoginLogParams)
 	UpdateLoginInfo(ctx context.Context, id uint64, ip string) (err error)
 	NotCheckAuthAdminIds(ctx context.Context) *gset.Set
-	GetAdminRules(ctx context.Context, userId uint64) (menuList []*model.UserMenus, err error)
+	GetAdminRules(ctx context.Context, userId uint64) (menuList []*model.UserMenus, permissions []string, err error)
 }
 
 type userImpl struct{}
@@ -114,7 +114,7 @@ func (s *userImpl) UpdateLoginInfo(ctx context.Context, id uint64, ip string) (e
 }
 
 // GetAdminRules 获取用户菜单数据
-func (s *userImpl) GetAdminRules(ctx context.Context, userId uint64) (menuList []*model.UserMenus, err error) {
+func (s *userImpl) GetAdminRules(ctx context.Context, userId uint64) (menuList []*model.UserMenus, permissions []string, err error) {
 	err = g.Try(func() {
 		//是否超管
 		isSuperAdmin := false
@@ -140,9 +140,14 @@ func (s *userImpl) GetAdminRules(ctx context.Context, userId uint64) (menuList [
 		//获取菜单信息
 		if isSuperAdmin {
 			//超管获取所有菜单
+			permissions = []string{"*/*/*"}
 			menuList, err = s.GetAllMenus(ctx)
+			liberr.ErrIsNil(ctx, err)
 		} else {
 			menuList, err = s.GetAdminMenusByRoleIds(ctx, roleIds)
+			liberr.ErrIsNil(ctx, err)
+			permissions, err = s.GetPermissions(ctx, roleIds)
+			liberr.ErrIsNil(ctx, err)
 		}
 	})
 	return
@@ -279,3 +284,30 @@ func (s *userImpl) setMenuData(menu *model.UserMenu, entity *model.SysAuthRuleIn
 	}
 	return menu
 }
+
+func (s *userImpl) GetPermissions(ctx context.Context, roleIds []uint) (userButtons []string, err error) {
+	err = g.Try(func() {
+		//获取角色对应的菜单id
+		enforcer, err := service.CasbinEnforcer(ctx)
+		liberr.ErrIsNil(ctx, err)
+		menuIds := map[int64]int64{}
+		for _, roleId := range roleIds {
+			//查询当前权限
+			gp := enforcer.GetFilteredPolicy(0, gconv.String(roleId))
+			for _, p := range gp {
+				mid := gconv.Int64(p[1])
+				menuIds[mid] = mid
+			}
+		}
+		//获取所有开启的按钮
+		allButtons, err := Rule().GetIsButtonStatusList(ctx)
+		liberr.ErrIsNil(ctx, err)
+		userButtons = make([]string, 0, len(allButtons))
+		for _, button := range allButtons {
+			if _, ok := menuIds[gconv.Int64(button.Id)]; gstr.Equal(button.Condition, "nocheck") || ok {
+				userButtons = append(userButtons, button.Name)
+			}
+		}
+	})
+	return
+}