diff --git a/internal/api/casbin_api/cabin_remove_policy.go b/internal/api/casbin_api/cabin_remove_policy.go new file mode 100644 index 0000000..4b90925 --- /dev/null +++ b/internal/api/casbin_api/cabin_remove_policy.go @@ -0,0 +1,29 @@ +package casbin_api + +import ( + "EnGin/internal/db" + "EnGin/internal/global" + "EnGin/internal/middleware" + "EnGin/internal/utils/res" + + "github.com/gin-gonic/gin" + "go.uber.org/zap" +) + +func (CasbinApi) CasbinRemovePolicyView(c *gin.Context) { + cr := middleware.GetBind[PolicyRequest](c) + + isRemoved, err := db.GlobalEnforcer.RemovePolicy(cr.RoleID, cr.Path, cr.Method) + if err != nil { + global.Log.Error("删除策略失败", zap.Error(err)) + res.InternalError("删除策略失败", c) + return + } + + if !isRemoved { + res.NotFound("策略不存在", c) + return + } + + res.OkWithMsg("策略删除成功", c) +} diff --git a/internal/api/casbin_api/casbin_add_policy.go b/internal/api/casbin_api/casbin_add_policy.go new file mode 100644 index 0000000..b71abaa --- /dev/null +++ b/internal/api/casbin_api/casbin_add_policy.go @@ -0,0 +1,29 @@ +package casbin_api + +import ( + "EnGin/internal/db" + "EnGin/internal/global" + "EnGin/internal/middleware" + "EnGin/internal/utils/res" + + "github.com/gin-gonic/gin" + "go.uber.org/zap" +) + +func (CasbinApi) CasbinAddPolicyView(c *gin.Context) { + cr := middleware.GetBind[PolicyRequest](c) + + isAdded, err := db.GlobalEnforcer.AddPolicy(cr.RoleID, cr.Path, cr.Method) + if err != nil { + global.Log.Error("添加策略失败", zap.Error(err)) + res.InternalError("添加策略失败", c) + return + } + + if !isAdded { + res.OkWithMsg("策略已存在", c) + return + } + + res.OkWithMsg("策略添加成功", c) +} diff --git a/internal/api/casbin_api/casbin_add_role_inheritance.go b/internal/api/casbin_api/casbin_add_role_inheritance.go new file mode 100644 index 0000000..016a228 --- /dev/null +++ b/internal/api/casbin_api/casbin_add_role_inheritance.go @@ -0,0 +1,30 @@ +package casbin_api + +import ( + "EnGin/internal/db" + "EnGin/internal/global" + "EnGin/internal/middleware" + "EnGin/internal/utils/res" + + "github.com/gin-gonic/gin" + "go.uber.org/zap" +) + +func (CasbinApi) CasbinAddRoleInheritanceView(c *gin.Context) { + cr := middleware.GetBind[RoleInheritanceRequest](c) + + // 添加角色继承关系 + isAdded, err := db.GlobalEnforcer.AddGroupingPolicy(cr.RoleID, cr.InheritFrom) + if err != nil { + global.Log.Error("添加角色继承关系失败", zap.Error(err)) + res.InternalError("添加角色继承关系失败", c) + return + } + + if !isAdded { + res.OkWithMsg("角色继承关系已经存在", c) + return + } + + res.OkWithMsg("角色继承关系添加成功", c) +} diff --git a/internal/api/casbin_api/casbin_policy_list.go b/internal/api/casbin_api/casbin_policy_list.go new file mode 100644 index 0000000..e941c54 --- /dev/null +++ b/internal/api/casbin_api/casbin_policy_list.go @@ -0,0 +1,48 @@ +package casbin_api + +import ( + "EnGin/internal/db" + "EnGin/internal/global" + "EnGin/internal/utils/res" + + "github.com/gin-gonic/gin" + "go.uber.org/zap" +) + +type PolicyListResponse struct { + Policies [][]string `json:"policies"` + GroupingPolicies [][]string `json:"grouping_policies"` +} + +func (CasbinApi) CasbinPolicyListView(c *gin.Context) { + // 获取所有策略 + policies, err := db.GlobalEnforcer.GetPolicy() + if err != nil { + global.Log.Error("获取策略失败", zap.Error(err)) + res.FailWithMsg("获取策略失败", c) + return + } + + if policies == nil { + policies = [][]string{} + } + + // 获取所有角色继承关系 + groupingPolicies, err := db.GlobalEnforcer.GetGroupingPolicy() + if err != nil { + global.Log.Error("获取继承策略失败", zap.Error(err)) + res.FailWithMsg("获取继承策略失败", c) + return + } + + if groupingPolicies == nil { + groupingPolicies = [][]string{} + } + + policyAllList := PolicyListResponse{ + Policies: policies, + GroupingPolicies: groupingPolicies, + } + + res.OkWithData(policyAllList, c) +} diff --git a/internal/api/casbin_api/casbin_remove_role_inheritance.go b/internal/api/casbin_api/casbin_remove_role_inheritance.go new file mode 100644 index 0000000..3027f27 --- /dev/null +++ b/internal/api/casbin_api/casbin_remove_role_inheritance.go @@ -0,0 +1,30 @@ +package casbin_api + +import ( + "EnGin/internal/db" + "EnGin/internal/global" + "EnGin/internal/middleware" + "EnGin/internal/utils/res" + + "github.com/gin-gonic/gin" + "go.uber.org/zap" +) + +func (CasbinApi) CasbinRemoveRoleInheritanceView(c *gin.Context) { + cr := middleware.GetBind[RoleInheritanceRequest](c) + + // 移除角色继承关系: g,roleID,inheritFrom + isRemoved, err := db.GlobalEnforcer.RemoveGroupingPolicy(cr.RoleID, cr.InheritFrom) + if err != nil { + global.Log.Error("移除角色继承关系失败", zap.Error(err)) + res.InternalError("移除角色继承关系失败", c) + return + } + + if !isRemoved { + res.NotFound("角色关系继承不存在", c) + return + } + + res.OkWithMsg("角色继承关系移除成功", c) +} diff --git a/internal/api/casbin_api/casbin_role_inheritance_list.go b/internal/api/casbin_api/casbin_role_inheritance_list.go new file mode 100644 index 0000000..645c6c9 --- /dev/null +++ b/internal/api/casbin_api/casbin_role_inheritance_list.go @@ -0,0 +1,26 @@ +package casbin_api + +import ( + "EnGin/internal/db" + "EnGin/internal/global" + "EnGin/internal/utils/res" + + "github.com/gin-gonic/gin" + "go.uber.org/zap" +) + +func (CasbinApi) CasbinRoleInheritanceListView(c *gin.Context) { + // 获取所以角色关系 + policies, err := db.GlobalEnforcer.GetGroupingPolicy() + if err != nil { + global.Log.Error("查询角色继承关系失败", zap.Error(err)) + res.InternalError("查询角色继承关系失败", c) + return + } + + if policies == nil { + policies = [][]string{} + } + + res.OkWithData(policies, c) +} diff --git a/internal/api/casbin_api/enter.go b/internal/api/casbin_api/enter.go new file mode 100644 index 0000000..e5f4a46 --- /dev/null +++ b/internal/api/casbin_api/enter.go @@ -0,0 +1,15 @@ +package casbin_api + +type CasbinApi struct { +} + +type PolicyRequest struct { + RoleID string `json:"role_id" binding:"required" label:"角色ID"` + Path string `json:"path" binding:"required" label:"访问路径"` + Method string `json:"method" binding:"required" label:"请求方法"` +} + +type RoleInheritanceRequest struct { + RoleID string `json:"role_id" binding:"required" label:"角色ID"` + InheritFrom string `json:"inherit_from" binding:"required" label:"继承自角色ID"` +} diff --git a/internal/api/enter.go b/internal/api/enter.go index 857e087..1e05ea5 100644 --- a/internal/api/enter.go +++ b/internal/api/enter.go @@ -2,12 +2,14 @@ package api import ( "EnGin/internal/api/auth_api" + "EnGin/internal/api/casbin_api" "EnGin/internal/api/user_api" ) type Api struct { - AuthApi auth_api.AuthApi - UserApi user_api.UserApi + AuthApi auth_api.AuthApi + UserApi user_api.UserApi + CasbinApi casbin_api.CasbinApi } // App 统一导出全局 API 实例 diff --git a/internal/router/casbin_router.go b/internal/router/casbin_router.go new file mode 100644 index 0000000..1e53dc3 --- /dev/null +++ b/internal/router/casbin_router.go @@ -0,0 +1,37 @@ +package router + +import ( + "EnGin/internal/api" + "EnGin/internal/api/casbin_api" + "EnGin/internal/middleware" + + "github.com/gin-gonic/gin" +) + +func CasbinRouter(g *gin.RouterGroup) { + app := api.App.CasbinApi + g.GET("policy", middleware.AuthAdmin, app.CasbinPolicyListView) + + g.POST("policy", + middleware.AuthAdmin, + middleware.BindJsonMiddleware[casbin_api.PolicyRequest], + app.CasbinAddPolicyView) + + g.DELETE("policy", + middleware.AuthAdmin, + middleware.BindJsonMiddleware[casbin_api.PolicyRequest], + app.CasbinRemovePolicyView) + + // 角色继承权限路由 + g.POST("role_inheritance", + middleware.AuthAdmin, + middleware.BindJsonMiddleware[casbin_api.RoleInheritanceRequest], + app.CasbinAddRoleInheritanceView) + + g.DELETE("role_inheritance", + middleware.AuthAdmin, + middleware.BindJsonMiddleware[casbin_api.RoleInheritanceRequest], + app.CasbinRemoveRoleInheritanceView) + + g.GET("role_inheritance", middleware.AuthAdmin, app.CasbinRoleInheritanceListView) +} diff --git a/internal/router/enter.go b/internal/router/enter.go index 1c0df3a..ba286d4 100644 --- a/internal/router/enter.go +++ b/internal/router/enter.go @@ -10,4 +10,5 @@ func RegisterRoutes(r *gin.Engine) { g := r.Group("api/v1") AuthRouter(g) UserRouter(g) + CasbinRouter(g) }