From ba551fb724260a7f500dea7124acf7006e6aa5ce Mon Sep 17 00:00:00 2001 From: momo <1012651275@qq.com> Date: Fri, 17 Nov 2023 11:53:35 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E6=96=B0=E5=A2=9E:=E6=9D=83=E9=99=90?= =?UTF-8?q?=E5=88=86=E7=BB=84=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/ldap-admin/internal/logic/deleteldapgrouplogic.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/server/ldap-admin/internal/logic/deleteldapgrouplogic.go b/server/ldap-admin/internal/logic/deleteldapgrouplogic.go index 68d8a916..1d565110 100644 --- a/server/ldap-admin/internal/logic/deleteldapgrouplogic.go +++ b/server/ldap-admin/internal/logic/deleteldapgrouplogic.go @@ -36,7 +36,7 @@ func NewDeleteLdapGroupLogic(ctx context.Context, svcCtx *svc.ServiceContext) *D func (l *DeleteLdapGroupLogic) DeleteLdapGroup(req *types.DeleteLdapGroupReq, userinfo *auth.UserInfo) (resp *basic.Response) { // 返回值必须调用Set重新返回, resp可以空指针调用 resp.SetStatus(basic.CodeOK, data) // userinfo 传入值时, 一定不为null - resLdapGroup, err := l.svcCtx.AllModels.LdapGroup.FindOneById(l.ctx, req.Id) + resLdapGroupInfo, err := l.svcCtx.AllModels.LdapGroup.FindOneById(l.ctx, req.Id) if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { basic.CodeServiceErr.Message = "记录不存在" @@ -47,15 +47,15 @@ func (l *DeleteLdapGroupLogic) DeleteLdapGroup(req *types.DeleteLdapGroupReq, us } txErr := l.svcCtx.MysqlConn.WithContext(l.ctx).Transaction(func(tx *gorm.DB) error { //删除权限组、权限组相关 - resLdapGroupDel := tx.Delete(&resLdapGroup) + resLdapGroupDel := tx.Delete(&resLdapGroupInfo) if resLdapGroupDel.Error != nil { return resLdapGroupDel.Error } - resLdapUserGroupDel := tx.Where("group_id = ?", resLdapGroup.Id).Delete(&gmodel.LdapUserGroup{}) + resLdapUserGroupDel := tx.Where("group_id = ?", resLdapGroupInfo.Id).Delete(&gmodel.LdapUserGroup{}) if resLdapUserGroupDel.Error != nil { return resLdapUserGroupDel.Error } - resLdapGroupMenusDel := tx.Where("group_id = ?", resLdapGroup.Id).Delete(&gmodel.LdapGroupMenus{}) + resLdapGroupMenusDel := tx.Where("group_id = ?", resLdapGroupInfo.Id).Delete(&gmodel.LdapGroupMenus{}) if resLdapGroupMenusDel.Error != nil { return resLdapGroupMenusDel.Error } From 6f146683426673ab9a12563feb89eda5701af22f Mon Sep 17 00:00:00 2001 From: momo <1012651275@qq.com> Date: Fri, 17 Nov 2023 14:53:28 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E6=96=B0=E5=A2=9E:=E6=9D=83=E9=99=90?= =?UTF-8?q?=E5=88=86=E7=BB=84=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- model/gmodel/ldap_apis_logic.go | 14 ++++ server/ldap-admin/internal/handler/routes.go | 10 +++ .../handler/setldapcasbinrulehandler.go | 35 +++++++++ .../handler/setldapgroupmenushandler.go | 35 +++++++++ .../internal/logic/setldapcasbinrulelogic.go | 76 +++++++++++++++++++ .../internal/logic/setldapgroupmenuslogic.go | 66 ++++++++++++++++ server/ldap-admin/internal/types/types.go | 10 +++ server_api/ldap-admin.api | 16 ++++ 8 files changed, 262 insertions(+) create mode 100644 server/ldap-admin/internal/handler/setldapcasbinrulehandler.go create mode 100644 server/ldap-admin/internal/handler/setldapgroupmenushandler.go create mode 100644 server/ldap-admin/internal/logic/setldapcasbinrulelogic.go create mode 100644 server/ldap-admin/internal/logic/setldapgroupmenuslogic.go diff --git a/model/gmodel/ldap_apis_logic.go b/model/gmodel/ldap_apis_logic.go index 92aec596..1e51575a 100644 --- a/model/gmodel/ldap_apis_logic.go +++ b/model/gmodel/ldap_apis_logic.go @@ -3,6 +3,8 @@ package gmodel import ( "context" "time" + + "gorm.io/gorm" ) // TODO: 使用model的属性做你想做的 @@ -14,6 +16,18 @@ type FindPageReq struct { Limit int //每页数量 } +// FindAll 全部查询 +func (s *LdapApisModel) FindAll(ctx context.Context, gorm *gorm.DB) (resp []LdapApis, err error) { + var db = gorm + if gorm == nil { + db = s.db.WithContext(ctx).Model(&LdapApis{}) + } else { + db = db.WithContext(ctx).Model(&LdapApis{}) + } + err = db.Find(&resp).Error + return resp, err +} + // FindPage 分页查询 func (s *LdapApisModel) FindPage(ctx context.Context, req FindPageReq) (resp []LdapApis, total int64, err error) { db := s.db.WithContext(ctx).Model(&LdapApis{}) diff --git a/server/ldap-admin/internal/handler/routes.go b/server/ldap-admin/internal/handler/routes.go index 429c19a7..8a4a59bb 100644 --- a/server/ldap-admin/internal/handler/routes.go +++ b/server/ldap-admin/internal/handler/routes.go @@ -27,6 +27,16 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) { Path: "/api/ldap-admin/delete_ldap_group", Handler: DeleteLdapGroupHandler(serverCtx), }, + { + Method: http.MethodPost, + Path: "/api/ldap-admin/set_ldap_group_menus", + Handler: SetLdapGroupMenusHandler(serverCtx), + }, + { + Method: http.MethodPost, + Path: "/api/ldap-admin/set_ldap_casbin_rule", + Handler: SetLdapCasbinRuleHandler(serverCtx), + }, { Method: http.MethodGet, Path: "/api/ldap-admin/get_apis", diff --git a/server/ldap-admin/internal/handler/setldapcasbinrulehandler.go b/server/ldap-admin/internal/handler/setldapcasbinrulehandler.go new file mode 100644 index 00000000..2c6b0d5e --- /dev/null +++ b/server/ldap-admin/internal/handler/setldapcasbinrulehandler.go @@ -0,0 +1,35 @@ +package handler + +import ( + "net/http" + "reflect" + + "fusenapi/utils/basic" + + "fusenapi/server/ldap-admin/internal/logic" + "fusenapi/server/ldap-admin/internal/svc" + "fusenapi/server/ldap-admin/internal/types" +) + +func SetLdapCasbinRuleHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + + var req types.SetLdapCasbinRuleReq + userinfo, err := basic.RequestParse(w, r, svcCtx, &req) + if err != nil { + return + } + + // 创建一个业务逻辑层实例 + l := logic.NewSetLdapCasbinRuleLogic(r.Context(), svcCtx) + + rl := reflect.ValueOf(l) + basic.BeforeLogic(w, r, rl) + + resp := l.SetLdapCasbinRule(&req, userinfo) + + if !basic.AfterLogic(w, r, rl, resp) { + basic.NormalAfterLogic(w, r, resp) + } + } +} diff --git a/server/ldap-admin/internal/handler/setldapgroupmenushandler.go b/server/ldap-admin/internal/handler/setldapgroupmenushandler.go new file mode 100644 index 00000000..b8272ccd --- /dev/null +++ b/server/ldap-admin/internal/handler/setldapgroupmenushandler.go @@ -0,0 +1,35 @@ +package handler + +import ( + "net/http" + "reflect" + + "fusenapi/utils/basic" + + "fusenapi/server/ldap-admin/internal/logic" + "fusenapi/server/ldap-admin/internal/svc" + "fusenapi/server/ldap-admin/internal/types" +) + +func SetLdapGroupMenusHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + + var req types.SetLdapGroupMenusReq + userinfo, err := basic.RequestParse(w, r, svcCtx, &req) + if err != nil { + return + } + + // 创建一个业务逻辑层实例 + l := logic.NewSetLdapGroupMenusLogic(r.Context(), svcCtx) + + rl := reflect.ValueOf(l) + basic.BeforeLogic(w, r, rl) + + resp := l.SetLdapGroupMenus(&req, userinfo) + + if !basic.AfterLogic(w, r, rl, resp) { + basic.NormalAfterLogic(w, r, resp) + } + } +} diff --git a/server/ldap-admin/internal/logic/setldapcasbinrulelogic.go b/server/ldap-admin/internal/logic/setldapcasbinrulelogic.go new file mode 100644 index 00000000..04dac6c3 --- /dev/null +++ b/server/ldap-admin/internal/logic/setldapcasbinrulelogic.go @@ -0,0 +1,76 @@ +package logic + +import ( + "errors" + "fusenapi/model/gmodel" + "fusenapi/utils/auth" + "fusenapi/utils/basic" + "strconv" + + "context" + + "fusenapi/server/ldap-admin/internal/svc" + "fusenapi/server/ldap-admin/internal/types" + + "github.com/zeromicro/go-zero/core/logx" + "gorm.io/gorm" +) + +type SetLdapCasbinRuleLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewSetLdapCasbinRuleLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SetLdapCasbinRuleLogic { + return &SetLdapCasbinRuleLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +// 处理进入前逻辑w,r +// func (l *SetLdapCasbinRuleLogic) BeforeLogic(w http.ResponseWriter, r *http.Request) { +// } + +func (l *SetLdapCasbinRuleLogic) SetLdapCasbinRule(req *types.SetLdapCasbinRuleReq, userinfo *auth.UserInfo) (resp *basic.Response) { + // 返回值必须调用Set重新返回, resp可以空指针调用 resp.SetStatus(basic.CodeOK, data) + // userinfo 传入值时, 一定不为null + resLdapGroupInfo, err := l.svcCtx.AllModels.LdapGroup.FindOneById(l.ctx, req.GroupId) + if err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + basic.CodeServiceErr.Message = "权限组记录不存在" + } else { + basic.CodeServiceErr.Message = "系统出错" + } + return resp.SetStatus(basic.CodeServiceErr) + } + resLdapApiList, err := l.svcCtx.AllModels.LdapApis.FindAll(l.ctx, l.svcCtx.MysqlConn.Where("id IN ?", req.ApIds)) + if err != nil { + return resp.SetStatus(basic.CodeServiceErr) + } + if len(resLdapApiList) > 0 { + var groupIdStr = strconv.Itoa(int(resLdapGroupInfo.Id)) + var ldapCasbinRules []gmodel.LdapCasbinRule + for _, ldapApi := range resLdapApiList { + ldapCasbinRules = append(ldapCasbinRules, gmodel.LdapCasbinRule{ + V0: &groupIdStr, + V1: ldapApi.Path, + V2: ldapApi.Method, + }) + } + resCreateInBatches := l.svcCtx.MysqlConn.WithContext(l.ctx).CreateInBatches(ldapCasbinRules, 100) + if resCreateInBatches.Error != nil { + basic.CodeServiceErr.Message = "系统出错" + return resp.SetStatus(basic.CodeServiceErr) + } + } + + return resp.SetStatus(basic.CodeOK) +} + +// 处理逻辑后 w,r 如:重定向, resp 必须重新处理 +// func (l *SetLdapCasbinRuleLogic) AfterLogic(w http.ResponseWriter, r *http.Request, resp *basic.Response) { +// // httpx.OkJsonCtx(r.Context(), w, resp) +// } diff --git a/server/ldap-admin/internal/logic/setldapgroupmenuslogic.go b/server/ldap-admin/internal/logic/setldapgroupmenuslogic.go new file mode 100644 index 00000000..dc26f316 --- /dev/null +++ b/server/ldap-admin/internal/logic/setldapgroupmenuslogic.go @@ -0,0 +1,66 @@ +package logic + +import ( + "errors" + "fusenapi/model/gmodel" + "fusenapi/utils/auth" + "fusenapi/utils/basic" + + "context" + + "fusenapi/server/ldap-admin/internal/svc" + "fusenapi/server/ldap-admin/internal/types" + + "github.com/zeromicro/go-zero/core/logx" + "gorm.io/gorm" +) + +type SetLdapGroupMenusLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewSetLdapGroupMenusLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SetLdapGroupMenusLogic { + return &SetLdapGroupMenusLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +// 处理进入前逻辑w,r +// func (l *SetLdapGroupMenusLogic) BeforeLogic(w http.ResponseWriter, r *http.Request) { +// } + +func (l *SetLdapGroupMenusLogic) SetLdapGroupMenus(req *types.SetLdapGroupMenusReq, userinfo *auth.UserInfo) (resp *basic.Response) { + // 返回值必须调用Set重新返回, resp可以空指针调用 resp.SetStatus(basic.CodeOK, data) + // userinfo 传入值时, 一定不为null + resLdapGroupInfo, err := l.svcCtx.AllModels.LdapGroup.FindOneById(l.ctx, req.GroupId) + if err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + basic.CodeServiceErr.Message = "权限组记录不存在" + } else { + basic.CodeServiceErr.Message = "系统出错" + } + return resp.SetStatus(basic.CodeServiceErr) + } + var groupMenus []gmodel.LdapGroupMenus + for _, menuId := range req.MenuIds { + groupMenus = append(groupMenus, gmodel.LdapGroupMenus{ + GroupId: &resLdapGroupInfo.Id, + MenuId: &menuId, + }) + } + resCreateInBatches := l.svcCtx.MysqlConn.WithContext(l.ctx).CreateInBatches(groupMenus, 100) + if resCreateInBatches.Error != nil { + basic.CodeServiceErr.Message = "系统出错" + return resp.SetStatus(basic.CodeServiceErr) + } + return resp.SetStatus(basic.CodeOK) +} + +// 处理逻辑后 w,r 如:重定向, resp 必须重新处理 +// func (l *SetLdapGroupMenusLogic) AfterLogic(w http.ResponseWriter, r *http.Request, resp *basic.Response) { +// // httpx.OkJsonCtx(r.Context(), w, resp) +// } diff --git a/server/ldap-admin/internal/types/types.go b/server/ldap-admin/internal/types/types.go index 964f9df3..0425fa44 100644 --- a/server/ldap-admin/internal/types/types.go +++ b/server/ldap-admin/internal/types/types.go @@ -28,6 +28,16 @@ type DeleteLdapGroupReq struct { Id int64 `json:"id"` //id } +type SetLdapGroupMenusReq struct { + GroupId int64 `json:"group_id"` + MenuIds []int64 `json:"menu_ids"` +} + +type SetLdapCasbinRuleReq struct { + GroupId int64 `json:"group_id"` + ApIds []int64 `json:"api_ids"` +} + type GetApisReq struct { Sort string `form:"sort,optional"` CurrentPage int `form:"current_page,optional,default=1"` diff --git a/server_api/ldap-admin.api b/server_api/ldap-admin.api index 94503b22..08a100cf 100644 --- a/server_api/ldap-admin.api +++ b/server_api/ldap-admin.api @@ -20,6 +20,14 @@ service ldap-admin { @handler DeleteLdapGroupHandler post /api/ldap-admin/delete_ldap_group(DeleteLdapGroupReq) returns (response); + //权限组授权菜单 + @handler SetLdapGroupMenusHandler + post /api/ldap-admin/set_ldap_group_menus(SetLdapGroupMenusReq) returns (response); + + //权限组授权接口 + @handler SetLdapCasbinRuleHandler + post /api/ldap-admin/set_ldap_casbin_rule(SetLdapCasbinRuleReq) returns (response); + //获取API列表 @handler GetApisHandler get /api/ldap-admin/get_apis(GetApisReq) returns (response); @@ -95,6 +103,14 @@ type ( DeleteLdapGroupReq { Id int64 `json:"id"` //id } + SetLdapGroupMenusReq { + GroupId int64 `json:"group_id"` + MenuIds []int64 `json:"menu_ids"` + } + SetLdapCasbinRuleReq { + GroupId int64 `json:"group_id"` + ApIds []int64 `json:"api_ids"` + } ) type GetApisReq {