package controllers import ( "opsxloki/dto" "opsxloki/services" "opsxloki/utils" "github.com/gin-gonic/gin" ) // LdapController LDAP 配置与用户导入(配置读写仅 admin) type LdapController struct{} func NewLdapController() *LdapController { return &LdapController{} } // GetConfig LDAP 配置(密码剔除,附 hasPassword/configured) func (ctrl *LdapController) GetConfig(c *gin.Context) { utils.Success(c, services.GetLDAPPublicConfig()) } // UpdateConfig 保存配置(bindPassword 空则保留旧值) func (ctrl *LdapController) UpdateConfig(c *gin.Context) { var req dto.LdapConfigRequest if !utils.BindAndValidate(c, &req) { return } cfg := &services.LDAPConfig{ Enabled: req.Enabled, Host: req.Host, Port: req.Port, UseSSL: req.UseSSL, BindDN: req.BindDN, BindPassword: req.BindPassword, BaseDN: req.BaseDN, UserFilter: req.UserFilter, UsernameAttr: req.UsernameAttr, NameAttr: req.NameAttr, EmailAttr: req.EmailAttr, } if err := services.SaveLDAPConfig(cfg); err != nil { utils.Error(c, 400, err.Error()) return } utils.Success(c, services.GetLDAPPublicConfig()) } // TestConnection 用表单参数测试(未保存也可测;密码空回退已存;可选用户级验证) func (ctrl *LdapController) TestConnection(c *gin.Context) { var req dto.LdapConfigRequest if !utils.BindAndValidate(c, &req) { return } cfg := &services.LDAPConfig{ Enabled: req.Enabled, Host: req.Host, Port: req.Port, UseSSL: req.UseSSL, BindDN: req.BindDN, BindPassword: req.BindPassword, BaseDN: req.BaseDN, UserFilter: req.UserFilter, UsernameAttr: req.UsernameAttr, NameAttr: req.NameAttr, EmailAttr: req.EmailAttr, } if cfg.Port == 0 { cfg.Port = 389 } result := services.TestLDAPConnection(cfg, req.TestUsername, req.TestPassword) utils.Success(c, result) } // ListUsers 导入预览:按 ouDN(空用 baseDN)搜索用户 func (ctrl *LdapController) ListUsers(c *gin.Context) { var req dto.LdapUsersRequest if !utils.BindAndValidate(c, &req) { return } cfg := services.GetLDAPConfig() if !cfg.Enabled || cfg.Host == "" { utils.Error(c, 400, "LDAP 未启用或未配置") return } if req.BindPassword != "" { cfg.BindPassword = req.BindPassword } users, err := services.SearchLDAPUsersForImport(cfg, req.OUDN) if err != nil { utils.Error(c, 400, err.Error()) return } utils.Success(c, users) }