fusenapi/server/ldap-admin/internal/logic/getldapuserinfologic.go
laodaming b842216033 fix
2023-11-27 17:55:16 +08:00

114 lines
3.7 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package logic
import (
"context"
"fmt"
"fusenapi/server/ldap-admin/internal/svc"
"fusenapi/server/ldap-admin/internal/types"
"fusenapi/utils/basic"
"fusenapi/utils/email"
"github.com/go-ldap/ldap/v3"
"net/http"
"strings"
"github.com/zeromicro/go-zero/core/logx"
)
type GetLdapUserInfoLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewGetLdapUserInfoLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetLdapUserInfoLogic {
return &GetLdapUserInfoLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
// 处理进入前逻辑w,r
// func (l *GetLdapUserInfoLogic) BeforeLogic(w http.ResponseWriter, r *http.Request) {
// }
func (l *GetLdapUserInfoLogic) GetLdapUserInfo(req *types.GetLdapUserInfoReq, r *http.Request) (resp *basic.Response) {
if !l.svcCtx.Ldap.VerifyAuthority(r) {
return resp.SetStatusWithMessage(basic.CodeUnAuth, "无权限,请联系管理员开通")
}
if len(req.UserDN) <= 3 || req.UserDN[:3] != "cn=" {
return resp.SetStatusWithMessage(basic.CodeRequestParamsErr, "参数错误用户DN错误")
}
cnEmail := strings.Split(req.UserDN, ",")[0][3:]
if !email.IsEmailValid(cnEmail) {
return resp.SetStatusWithMessage(basic.CodeRequestParamsErr, "错误的用户cn")
}
user, err := l.svcCtx.Ldap.GetLdapUserInfo(req.UserDN)
if err != nil {
logx.Error(err)
return resp.SetStatusWithMessage(basic.CodeServiceErr, err.Error())
}
//属于哪些部门
filterBuilder := strings.Builder{}
for _, v := range user.OrganizationDNList {
//提取 ou
filterBuilder.WriteString(fmt.Sprintf("(%s)", strings.Split(v, ",")[0]))
}
for _, v := range user.ManageOrganizationDNList {
//提取 ou
filterBuilder.WriteString(fmt.Sprintf("(%s)", strings.Split(v, ",")[0]))
}
//存储map
mapOrganization := make(map[string]string)
if filterBuilder.Len() > 0 {
//查询部门信息
filter := "(&(objectClass=groupOfUniqueNames)(objectClass=top)(|" + filterBuilder.String() + "))"
fields := []string{"businessCategory", "dn"}
organizationsResult, err := l.svcCtx.Ldap.Search(l.svcCtx.Config.Ldap.BaseDN, ldap.ScopeWholeSubtree, filter, fields, nil)
if err != nil {
return resp.SetStatusWithMessage(basic.CodeServiceErr, "查询失败:"+err.Error())
}
for _, entry := range organizationsResult.Entries {
for _, attr := range entry.Attributes {
switch attr.Name {
case "businessCategory":
mapOrganization[entry.DN] = strings.Join(attr.Values, ",")
break //结束这层小循环
}
}
}
}
belongOrganizationList := make([]string, 0, len(user.OrganizationDNList))
for _, DN := range user.OrganizationDNList {
if name, ok := mapOrganization[DN]; ok {
belongOrganizationList = append(belongOrganizationList, name)
}
}
manageOrganizationList := make([]string, 0, len(user.ManageOrganizationDNList))
for _, DN := range user.ManageOrganizationDNList {
if name, ok := mapOrganization[DN]; ok {
manageOrganizationList = append(manageOrganizationList, name)
}
}
return resp.SetStatusWithMessage(basic.CodeOK, "success", types.GetLdapUserInfoRsp{
UserId: user.UserId,
UserDN: user.UserDN,
UserName: user.UserName,
Email: user.Email,
Mobile: user.Mobile,
Avatar: user.Avatar,
EmployeeTpye: user.EmployeeType,
Gender: user.Gender,
Birthday: user.Birthday,
BelongOriganization: belongOrganizationList,
ManageOriganization: manageOrganizationList,
Status: user.Status,
})
}
// 处理逻辑后 w,r 如:重定向, resp 必须重新处理
// func (l *GetLdapUserInfoLogic) AfterLogic(w http.ResponseWriter, r *http.Request, resp *basic.Response) {
// // httpx.OkJsonCtx(r.Context(), w, resp)
// }