97 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			97 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| 
								 | 
							
								package actions
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import (
							 | 
						||
| 
								 | 
							
									"errors"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									"github.com/gin-gonic/gin"
							 | 
						||
| 
								 | 
							
									log "github.com/go-admin-team/go-admin-core/logger"
							 | 
						||
| 
								 | 
							
									"github.com/go-admin-team/go-admin-core/sdk/config"
							 | 
						||
| 
								 | 
							
									"github.com/go-admin-team/go-admin-core/sdk/pkg"
							 | 
						||
| 
								 | 
							
									"github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth/user"
							 | 
						||
| 
								 | 
							
									"github.com/go-admin-team/go-admin-core/sdk/pkg/response"
							 | 
						||
| 
								 | 
							
									"gorm.io/gorm"
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								type DataPermission struct {
							 | 
						||
| 
								 | 
							
									DataScope string
							 | 
						||
| 
								 | 
							
									UserId    int
							 | 
						||
| 
								 | 
							
									DeptId    int
							 | 
						||
| 
								 | 
							
									RoleId    int
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func PermissionAction() gin.HandlerFunc {
							 | 
						||
| 
								 | 
							
									return func(c *gin.Context) {
							 | 
						||
| 
								 | 
							
										db, err := pkg.GetOrm(c)
							 | 
						||
| 
								 | 
							
										if err != nil {
							 | 
						||
| 
								 | 
							
											log.Error(err)
							 | 
						||
| 
								 | 
							
											return
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										msgID := pkg.GenerateMsgIDFromContext(c)
							 | 
						||
| 
								 | 
							
										var p = new(DataPermission)
							 | 
						||
| 
								 | 
							
										if userId := user.GetUserIdStr(c); userId != "" {
							 | 
						||
| 
								 | 
							
											p, err = newDataPermission(db, userId)
							 | 
						||
| 
								 | 
							
											if err != nil {
							 | 
						||
| 
								 | 
							
												log.Errorf("MsgID[%s] PermissionAction error: %s", msgID, err)
							 | 
						||
| 
								 | 
							
												response.Error(c, 500, err, "权限范围鉴定错误")
							 | 
						||
| 
								 | 
							
												c.Abort()
							 | 
						||
| 
								 | 
							
												return
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										c.Set(PermissionKey, p)
							 | 
						||
| 
								 | 
							
										c.Next()
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func newDataPermission(tx *gorm.DB, userId interface{}) (*DataPermission, error) {
							 | 
						||
| 
								 | 
							
									var err error
							 | 
						||
| 
								 | 
							
									p := &DataPermission{}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									err = tx.Table("sys_user").
							 | 
						||
| 
								 | 
							
										Select("sys_user.user_id", "sys_role.role_id", "sys_user.dept_id", "sys_role.data_scope").
							 | 
						||
| 
								 | 
							
										Joins("left join sys_role on sys_role.role_id = sys_user.role_id").
							 | 
						||
| 
								 | 
							
										Where("sys_user.user_id = ?", userId).
							 | 
						||
| 
								 | 
							
										Scan(p).Error
							 | 
						||
| 
								 | 
							
									if err != nil {
							 | 
						||
| 
								 | 
							
										err = errors.New("获取用户数据出错 msg:" + err.Error())
							 | 
						||
| 
								 | 
							
										return nil, err
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									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 ? ))", "%/"+pkg.IntToString(p.DeptId)+"/%")
							 | 
						||
| 
								 | 
							
										case "5":
							 | 
						||
| 
								 | 
							
											return db.Where(tableName+".create_by = ?", p.UserId)
							 | 
						||
| 
								 | 
							
										default:
							 | 
						||
| 
								 | 
							
											return db
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func getPermissionFromContext(c *gin.Context) *DataPermission {
							 | 
						||
| 
								 | 
							
									p := new(DataPermission)
							 | 
						||
| 
								 | 
							
									if pm, ok := c.Get(PermissionKey); ok {
							 | 
						||
| 
								 | 
							
										switch pm.(type) {
							 | 
						||
| 
								 | 
							
										case *DataPermission:
							 | 
						||
| 
								 | 
							
											p = pm.(*DataPermission)
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									return p
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// GetPermissionFromContext 提供非action写法数据范围约束
							 | 
						||
| 
								 | 
							
								func GetPermissionFromContext(c *gin.Context) *DataPermission {
							 | 
						||
| 
								 | 
							
									return getPermissionFromContext(c)
							 | 
						||
| 
								 | 
							
								}
							 |