Skip to content

Commit e3b8caf

Browse files
committed
fixed: 修复跨级操作角色权限的越权问题
1 parent 35fa2d7 commit e3b8caf

File tree

6 files changed

+52
-25
lines changed

6 files changed

+52
-25
lines changed

server/api/v1/system/sys_authority.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,8 @@ func (a *AuthorityApi) CopyAuthority(c *gin.Context) {
7676
response.FailWithMessage(err.Error(), c)
7777
return
7878
}
79-
authBack, err := authorityService.CopyAuthority(copyInfo)
79+
adminAuthorityID := utils.GetUserAuthorityId(c)
80+
authBack, err := authorityService.CopyAuthority(adminAuthorityID, copyInfo)
8081
if err != nil {
8182
global.GVA_LOG.Error("拷贝失败!", zap.Error(err))
8283
response.FailWithMessage("拷贝失败"+err.Error(), c)
@@ -186,7 +187,8 @@ func (a *AuthorityApi) SetDataAuthority(c *gin.Context) {
186187
response.FailWithMessage(err.Error(), c)
187188
return
188189
}
189-
err = authorityService.SetDataAuthority(auth)
190+
adminAuthorityID := utils.GetUserAuthorityId(c)
191+
err = authorityService.SetDataAuthority(adminAuthorityID, auth)
190192
if err != nil {
191193
global.GVA_LOG.Error("设置失败!", zap.Error(err))
192194
response.FailWithMessage("设置失败"+err.Error(), c)

server/api/v1/system/sys_casbin.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@ func (cas *CasbinApi) UpdateCasbin(c *gin.Context) {
3333
response.FailWithMessage(err.Error(), c)
3434
return
3535
}
36-
err = casbinService.UpdateCasbin(cmr.AuthorityId, cmr.CasbinInfos)
36+
adminAuthorityID := utils.GetUserAuthorityId(c)
37+
err = casbinService.UpdateCasbin(adminAuthorityID, cmr.AuthorityId, cmr.CasbinInfos)
3738
if err != nil {
3839
global.GVA_LOG.Error("更新失败!", zap.Error(err))
3940
response.FailWithMessage("更新失败", c)

server/api/v1/system/sys_menu.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,8 @@ func (a *AuthorityMenuApi) AddMenuAuthority(c *gin.Context) {
7575
response.FailWithMessage(err.Error(), c)
7676
return
7777
}
78-
if err := menuService.AddMenuAuthority(authorityMenu.Menus, authorityMenu.AuthorityId); err != nil {
78+
adminAuthorityID := utils.GetUserAuthorityId(c)
79+
if err := menuService.AddMenuAuthority(authorityMenu.Menus, adminAuthorityID, authorityMenu.AuthorityId); err != nil {
7980
global.GVA_LOG.Error("添加失败!", zap.Error(err))
8081
response.FailWithMessage("添加失败", c)
8182
} else {

server/service/system/sys_authority.go

Lines changed: 23 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ func (authorityService *AuthorityService) CreateAuthority(auth system.SysAuthori
5959
//@param: copyInfo response.SysAuthorityCopyResponse
6060
//@return: authority system.SysAuthority, err error
6161

62-
func (authorityService *AuthorityService) CopyAuthority(copyInfo response.SysAuthorityCopyResponse) (authority system.SysAuthority, err error) {
62+
func (authorityService *AuthorityService) CopyAuthority(adminAuthorityID uint, copyInfo response.SysAuthorityCopyResponse) (authority system.SysAuthority, err error) {
6363
var authorityBox system.SysAuthority
6464
if !errors.Is(global.GVA_DB.Where("authority_id = ?", copyInfo.Authority.AuthorityId).First(&authorityBox).Error, gorm.ErrRecordNotFound) {
6565
return authority, ErrRoleExistence
@@ -98,7 +98,7 @@ func (authorityService *AuthorityService) CopyAuthority(copyInfo response.SysAut
9898
}
9999
}
100100
paths := CasbinServiceApp.GetPolicyPathByAuthorityId(copyInfo.OldAuthorityId)
101-
err = CasbinServiceApp.UpdateCasbin(copyInfo.Authority.AuthorityId, paths)
101+
err = CasbinServiceApp.UpdateCasbin(adminAuthorityID, copyInfo.Authority.AuthorityId, paths)
102102
if err != nil {
103103
_ = authorityService.DeleteAuthority(&copyInfo.Authority)
104104
}
@@ -217,6 +217,8 @@ func (authorityService *AuthorityService) GetAuthorityInfoList(authorityID uint)
217217
//@return: list interface{}, total int64, err error
218218

219219
func (authorityService *AuthorityService) GetStructAuthorityList(authorityID uint) (list []uint, err error) {
220+
var auth system.SysAuthority
221+
_ = global.GVA_DB.First(&auth, "authority_id = ?", authorityID).Error
220222
var authorities []system.SysAuthority
221223
err = global.GVA_DB.Preload("DataAuthorityId").Where("parent_id = ?", authorityID).Find(&authorities).Error
222224
if len(authorities) > 0 {
@@ -225,6 +227,9 @@ func (authorityService *AuthorityService) GetStructAuthorityList(authorityID uin
225227
_, err = authorityService.GetStructAuthorityList(authorities[k].AuthorityId)
226228
}
227229
}
230+
if *auth.ParentId == 0 {
231+
list = append(list, authorityID)
232+
}
228233
return list, err
229234
}
230235

@@ -245,23 +250,9 @@ func (authorityService *AuthorityService) GetAuthorityInfo(auth system.SysAuthor
245250
//@param: auth model.SysAuthority
246251
//@return: error
247252

248-
func (authorityService *AuthorityService) SetDataAuthority(auth system.SysAuthority) error {
249-
var s system.SysAuthority
250-
global.GVA_DB.Preload("DataAuthorityId").First(&s, "authority_id = ?", auth.AuthorityId)
251-
err := global.GVA_DB.Model(&s).Association("DataAuthorityId").Replace(&auth.DataAuthorityId)
252-
return err
253-
}
254-
255-
//@author: [piexlmax](https://github.com/piexlmax)
256-
//@function: SetMenuAuthority
257-
//@description: 菜单与角色绑定
258-
//@param: auth *model.SysAuthority
259-
//@return: error
260-
261-
func (authorityService *AuthorityService) SetMenuAuthority(auth *system.SysAuthority) error {
262-
var s system.SysAuthority
253+
func (authorityService *AuthorityService) SetDataAuthority(adminAuthorityID uint, auth system.SysAuthority) error {
263254
if global.GVA_CONFIG.System.UseStrictAuth {
264-
authids, err := authorityService.GetStructAuthorityList(auth.AuthorityId)
255+
authids, err := AuthorityServiceApp.GetStructAuthorityList(adminAuthorityID)
265256
if err != nil {
266257
return err
267258
}
@@ -276,6 +267,20 @@ func (authorityService *AuthorityService) SetMenuAuthority(auth *system.SysAutho
276267
return errors.New("您提交的角色ID不合法")
277268
}
278269
}
270+
var s system.SysAuthority
271+
global.GVA_DB.Preload("DataAuthorityId").First(&s, "authority_id = ?", auth.AuthorityId)
272+
err := global.GVA_DB.Model(&s).Association("DataAuthorityId").Replace(&auth.DataAuthorityId)
273+
return err
274+
}
275+
276+
//@author: [piexlmax](https://github.com/piexlmax)
277+
//@function: SetMenuAuthority
278+
//@description: 菜单与角色绑定
279+
//@param: auth *model.SysAuthority
280+
//@return: error
281+
282+
func (authorityService *AuthorityService) SetMenuAuthority(auth *system.SysAuthority) error {
283+
var s system.SysAuthority
279284
global.GVA_DB.Preload("SysBaseMenus").First(&s, "authority_id = ?", auth.AuthorityId)
280285
err := global.GVA_DB.Model(&s).Association("SysBaseMenus").Replace(&auth.SysBaseMenus)
281286
return err

server/service/system/sys_casbin.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,10 @@ type CasbinService struct{}
2626

2727
var CasbinServiceApp = new(CasbinService)
2828

29-
func (casbinService *CasbinService) UpdateCasbin(AuthorityID uint, casbinInfos []request.CasbinInfo) error {
29+
func (casbinService *CasbinService) UpdateCasbin(adminAuthorityID, AuthorityID uint, casbinInfos []request.CasbinInfo) error {
3030

3131
if global.GVA_CONFIG.System.UseStrictAuth {
32-
authids, err := AuthorityServiceApp.GetStructAuthorityList(AuthorityID)
32+
authids, err := AuthorityServiceApp.GetStructAuthorityList(adminAuthorityID)
3333
if err != nil {
3434
return err
3535
}

server/service/system/sys_menu.go

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -196,10 +196,28 @@ func (menuService *MenuService) GetBaseMenuTree(authorityID uint) (menus []syste
196196
//@param: menus []model.SysBaseMenu, authorityId string
197197
//@return: err error
198198

199-
func (menuService *MenuService) AddMenuAuthority(menus []system.SysBaseMenu, authorityId uint) (err error) {
199+
func (menuService *MenuService) AddMenuAuthority(menus []system.SysBaseMenu, adminAuthorityID, authorityId uint) (err error) {
200200
var auth system.SysAuthority
201201
auth.AuthorityId = authorityId
202202
auth.SysBaseMenus = menus
203+
204+
if global.GVA_CONFIG.System.UseStrictAuth {
205+
authids, err := AuthorityServiceApp.GetStructAuthorityList(adminAuthorityID)
206+
if err != nil {
207+
return err
208+
}
209+
hasAuth := false
210+
for _, v := range authids {
211+
if v == authorityId {
212+
hasAuth = true
213+
break
214+
}
215+
}
216+
if !hasAuth {
217+
return errors.New("您提交的角色ID不合法")
218+
}
219+
}
220+
203221
err = AuthorityServiceApp.SetMenuAuthority(&auth)
204222
return err
205223
}

0 commit comments

Comments
 (0)