完善角色权限与数据隔离

This commit is contained in:
yml2213
2026-07-26 14:00:50 +08:00
parent b483cbc26d
commit 16d9ab0e5e
38 changed files with 2847 additions and 292 deletions
+9 -7
View File
@@ -14,12 +14,12 @@ type CustomerHandler struct{}
func NewCustomerHandler() *CustomerHandler { return &CustomerHandler{} }
func canAccessCustomer(c *gin.Context, customerID uint) bool {
if middleware.HasAnyRole(c, "admin", "supervisor") {
return true
}
if middleware.GetRole(c) != "agent" {
if !middleware.HasPermission(c, "customer.view") {
return false
}
if middleware.CanAccessAllData(c, "customer") {
return true
}
var count int64
model.DB.Model(&model.Session{}).
Where("tenant_id = ? AND customer_id = ? AND agent_id = ?", middleware.GetTenantID(c), customerID, middleware.GetUserID(c)).
@@ -38,7 +38,7 @@ func (h *CustomerHandler) List(c *gin.Context) {
var total int64
query := model.DB.Where("tenant_id = ?", tenantID)
if middleware.GetRole(c) == "agent" {
if !middleware.CanAccessAllData(c, "customer") {
assignedCustomers := model.DB.Model(&model.Session{}).
Select("customer_id").
Where("tenant_id = ? AND agent_id = ?", tenantID, middleware.GetUserID(c))
@@ -74,13 +74,14 @@ func (h *CustomerHandler) Get(c *gin.Context) {
return
}
if !canAccessCustomer(c, customer.ID) {
middleware.AuditDataAccessDenied(c, "customer", &customer.ID)
c.JSON(http.StatusForbidden, gin.H{"code": 403, "message": "无权查看该客户"})
return
}
var sessions []model.Session
sessionQuery := model.DB.Where("customer_id = ? AND tenant_id = ?", customer.ID, tenantID)
if middleware.GetRole(c) == "agent" {
if !middleware.CanAccessAllData(c, "customer") {
sessionQuery = sessionQuery.Where("agent_id = ?", middleware.GetUserID(c))
}
sessionQuery.Order("created_at desc").Limit(20).Find(&sessions)
@@ -233,6 +234,7 @@ func (h *CustomerHandler) Update(c *gin.Context) {
return
}
if !canAccessCustomer(c, customer.ID) {
middleware.AuditDataAccessDenied(c, "customer", &customer.ID)
c.JSON(http.StatusForbidden, gin.H{"code": 403, "message": "无权编辑该客户"})
return
}
@@ -319,7 +321,7 @@ func (h *CustomerHandler) Update(c *gin.Context) {
}
func (h *CustomerHandler) Delete(c *gin.Context) {
if !middleware.HasAnyRole(c, "admin", "supervisor") {
if !middleware.HasAnyPermission(c, "customer.export") {
c.JSON(http.StatusForbidden, gin.H{"code": 403, "message": "仅主管或管理员可删除客户"})
return
}