Golang如何使用ApplicationExtendedRequest请求结束LDAP事务
Golang 操作LDAP结束事务实现方案
报错根因
Failed to decode request错误的触发原因是结束LDAP事务的请求格式不符合RFC 5805规范:事务创建请求与结束请求的传参逻辑完全不同,将事务标识放在请求的Attributes属性列表中传递是错误写法,必须将事务ID做BER编码后放入ExtendedRequest的Value字段,服务端才能正常解析。
可直接运行的示例代码
示例基于主流的github.com/go-ldap/ldap/v3库实现,覆盖LDAP连接、事务创建、事务提交/回滚全流程:
import ( "crypto/tls" ber "github.com/go-asn1-ber/asn1-ber" "github.com/go-ldap/ldap/v3" ) func main() { // 初始化LDAP连接 conn, err := ldap.DialURL( "ldap://your-ldap-server-ip:389", ldap.DialWithTLSConfig(&tls.Config{InsecureSkipVerify: true}), ) if err != nil { panic(err) } defer conn.Close() // 绑定管理员账号 err = conn.Bind("cn=admin,dc=example,dc=com", "your-admin-password") if err != nil { panic(err) } // 创建事务(与已实现逻辑对齐) // 事务创建操作对应OID: 1.3.6.1.1.21.1 startTxnReq := ldap.NewExtendedRequest("1.3.6.1.1.21.1") startTxnResp, err := conn.Extended(startTxnReq) if err != nil { panic(err) } // 解析响应拿到全局唯一事务ID txnIDPacket := ber.DecodePacket(startTxnResp.Value) txnID := txnIDPacket.Data.Bytes() // --------------- // 此处编写事务内的增/删/改/查操作,所有操作请求需携带事务控件 // --------------- // 提交事务(结束事务的正确写法) // 事务提交操作对应OID: 1.3.6.1.1.21.3 commitTxnReq := ldap.NewExtendedRequest("1.3.6.1.1.21.3") // 核心步骤:将事务ID按BER规范编码后写入请求Value字段,不要传入Attributes列表 txnValPacket := ber.NewPacket(ber.ClassContext, ber.TypePrimitive, 0, txnID, "") commitTxnReq.Value = txnValPacket.Bytes() _, err = conn.Extended(commitTxnReq) if err != nil { panic(err) } // 如果需要回滚事务,替换上述提交逻辑为以下代码即可 // 事务回滚操作对应OID: 1.3.6.1.1.21.2 // rollbackTxnReq := ldap.NewExtendedRequest("1.3.6.1.1.21.2") // rollbackValPacket := ber.NewPacket(ber.ClassContext, ber.TypePrimitive, 0, txnID, "") // rollbackTxnReq.Value = rollbackValPacket.Bytes() // _, err = conn.Extended(rollbackTxnReq) // if err != nil { // panic(err) // } }
关键注意事项
- 禁止给结束事务的ExtendedRequest设置Attributes字段,所有事务相关参数必须通过Value字段传递
- 三个事务操作的OID不要混淆:创建
1.3.6.1.1.21.1、回滚1.3.6.1.1.21.2、提交1.3.6.1.1.21.3 - BER编码事务ID时,Class必须指定为
ber.ClassContext,类型为ber.TypePrimitive,标签值为0,编码格式错误同样会触发服务端解码失败 - LDAP事务为连接级别资源,禁止跨连接传递事务ID,会直接失效
内容的提问来源于stack exchange,提问作者user398026
相关产品推荐
相关产品推荐

