diff --git a/apis/actions/index.go b/apis/actions/index.go index 5d070d04..637744e1 100644 --- a/apis/actions/index.go +++ b/apis/actions/index.go @@ -33,9 +33,13 @@ func IndexAction(m model.ActiveRecord, d dto.Dtor) gin.HandlerFunc { tools.HasError(err, "参数验证失败", 422) err = req.Validate() tools.HasError(err, "参数验证失败", 422) + p, err := newDataPermission(db, tools.GetUserId(c)) err = db.WithContext(c).Model(object). - Scopes(tools.MakeCondition(req.GetNeedSearch())). - Scopes(tools.Paginate(req.GetPageSize(), req.GetPageIndex())). + Scopes( + tools.MakeCondition(req.GetNeedSearch()), + tools.Paginate(req.GetPageSize(), req.GetPageIndex()), + Permission(object.TableName(), p), + ). Find(list).Limit(-1).Offset(-1). Count(&count).Error if !errors.Is(err, gorm.ErrRecordNotFound) { diff --git a/apis/actions/permission.go b/apis/actions/permission.go new file mode 100644 index 00000000..7dc24f4b --- /dev/null +++ b/apis/actions/permission.go @@ -0,0 +1,61 @@ +package actions + +import ( + "errors" + "go-admin/models" + "go-admin/tools/config" + + "gorm.io/gorm" + + "go-admin/tools" +) + +type dataPermission struct { + DataScope string + UserId int + DeptId int + RoleId int +} + +func newDataPermission(tx *gorm.DB, userId interface{}) (*dataPermission, error) { + var err error + p := &dataPermission{} + sysUser := new(models.SysUser) + sysRole := new(models.SysRole) + + err = sysUser.GetByUserId(tx, userId) + if err != nil { + err = errors.New("获取用户数据出错 msg:" + err.Error()) + return nil, err + } + p.UserId = sysUser.UserId + p.RoleId = sysUser.RoleId + p.DeptId = sysUser.DeptId + err = sysRole.GetById(tx, sysUser.RoleId) + if err != nil { + err = errors.New("获取用户数据出错 msg:" + err.Error()) + return nil, err + } + p.DataScope = sysRole.DataScope + return p, nil +} + +func Permission(tableName string, p *dataPermission) func(db *gorm.DB) *gorm.DB { + return func(db *gorm.DB) *gorm.DB { + if !config.ApplicationConfig.EnableDP { + return db + } + switch p.DataScope { + case "2": + return db.Where(tableName+".create_by in (select sys_user.user_id from sys_role_dept left join sys_user on sys_user.dept_id=sys_role_dept.dept_id where sys_role_dept.role_id = ?)", p.RoleId) + case "3": + return db.Where(tableName+".create_by in (SELECT user_id from sys_user where dept_id = ? )", p.DeptId) + case "4": + return db.Where(tableName+".create_by in (SELECT user_id from sys_user where sys_user.dept_id in(select dept_id from sys_dept where dept_path like ? ))", "%"+tools.IntToString(p.DeptId)+"%") + case "5": + return db.Where(tableName+".create_by = ?", p.UserId) + default: + return db + } + } +} diff --git a/models/role.go b/models/role.go index 80d6c22c..57703d90 100644 --- a/models/role.go +++ b/models/role.go @@ -2,6 +2,7 @@ package models import ( "github.com/pkg/errors" + "gorm.io/gorm" orm "go-admin/global" "go-admin/tools" @@ -33,6 +34,10 @@ type MenuIdList struct { MenuId int `json:"menuId"` } +func (role *SysRole) GetById(tx *gorm.DB, id interface{}) error { + return tx.First(role, id).Error +} + func (role *SysRole) GetPage(pageSize int, pageIndex int) ([]SysRole, int, error) { var doc []SysRole diff --git a/models/sysuser.go b/models/sysuser.go index e0baae36..5911959b 100644 --- a/models/sysuser.go +++ b/models/sysuser.go @@ -2,6 +2,7 @@ package models import ( "errors" + "gorm.io/gorm" "log" "strings" @@ -224,7 +225,7 @@ func (e *SysUser) GetPage(pageSize int, pageIndex int) ([]SysUserPage, int, erro var count int64 - if err := table.Scopes(DataScopes(e.TableName(),userid)).Offset((pageIndex - 1) * pageSize).Limit(pageSize).Find(&doc).Offset(-1).Limit(-1).Count(&count).Error; err != nil { + if err := table.Scopes(DataScopes(e.TableName(), userid)).Offset((pageIndex - 1) * pageSize).Limit(pageSize).Find(&doc).Offset(-1).Limit(-1).Count(&count).Error; err != nil { return nil, 0, err } //table.Where("sys_user.deleted_at IS NULL").Count(&count) @@ -316,3 +317,7 @@ func (e *SysUser) SetPwd(pwd SysUserPwd) (Result bool, err error) { tools.HasError(err, "更新密码失败(代码202)", 500) return } + +func (e *SysUser) GetByUserId(tx *gorm.DB, id interface{}) error { + return tx.First(e, id).Error +}