Solr 7集成LDAP认证方案咨询:替代Jetty LDAPLoginModule的方法
我之前帮不少人处理过Solr 7集成LDAP的问题,确实因为自带Jetty是精简版,没法直接用Jetty原生的LDAPLoginModule,不过有几个靠谱的方案可以解决这个问题,下面逐个拆解:
方案一:扩展Jetty的LDAP支持(官方兼容路线)
既然Solr 7用的是Jetty 9.4.x系列,我们可以手动添加Jetty的LDAP相关依赖包,然后通过JAAS配置实现认证:
添加Jetty LDAP依赖包
下载对应Jetty 9.4.x版本的这几个jar包(版本要和Solr自带的Jetty版本完全匹配,比如Solr 7.7.3用的是Jetty 9.4.20.v20190813):jetty-ldap-xxx.jarjetty-jaas-xxx.jarjetty-security-xxx.jar
把它们放到Solr安装目录下的server/lib/ext文件夹里。
配置JAAS登录规则
创建一个login.conf文件,内容如下(根据你的LDAP环境修改参数):SolrLDAP { org.eclipse.jetty.jaas.spi.LdapLoginModule required debug="true" contextFactory="com.sun.jndi.ldap.LdapCtxFactory" hostname="your-ldap-server-ip" port="389" bindDn="cn=admin,dc=your-domain,dc=com" bindPassword="your-admin-password" userBaseDn="ou=users,dc=your-domain,dc=com" userRdnAttribute="uid" userIdAttribute="uid" userPasswordAttribute="userPassword" userObjectClass="inetOrgPerson" roleBaseDn="ou=groups,dc=your-domain,dc=com" roleNameAttribute="cn" roleMemberAttribute="member" roleObjectClass="groupOfNames"; };让Solr加载JAAS配置
修改Solr的启动配置文件:- Linux/macOS:编辑
bin/solr.in.sh,添加一行:SOLR_OPTS="$SOLR_OPTS -Djava.security.auth.login.config=/path/to/your/login.conf" - Windows:编辑
bin/solr.in.cmd,添加一行:set SOLR_OPTS=%SOLR_OPTS% -Djava.security.auth.login.config=C:\path\to\your\login.conf
- Linux/macOS:编辑
配置Solr安全策略
在Solr的server/solr目录下创建或修改security.json,启用JAAS认证:{ "authentication": { "class": "solr.JaasAuthenticationPlugin", "loginConfigName": "SolrLDAP" }, "authorization": { "class": "solr.RuleBasedAuthorizationPlugin", "permissions": [ { "name": "security-edit", "role": "solr-admin" }, { "name": "collection-admin", "role": "solr-editor" } ], "user-role": { "john.doe": ["solr-admin"] } } }
方案二:使用社区维护的LDAP认证插件
如果不想折腾Jetty依赖,社区有专门为Solr开发的LDAP认证插件,比如solr-ldap-auth-plugin(注意要选支持Solr 7的版本):
安装插件
下载对应Solr 7版本的插件jar包,放到server/lib/ext目录。配置security.json
修改security.json,直接指定LDAP相关参数(示例):{ "authentication": { "class": "com.github.mattweber.solr.security.LdapAuthenticationPlugin", "url": "ldap://your-ldap-server:389", "userDnPattern": "uid={0},ou=users,dc=your-domain,dc=com", "bindDn": "cn=admin,dc=your-domain,dc=com", "bindPassword": "your-admin-password", "groupSearchBase": "ou=groups,dc=your-domain,dc=com", "groupSearchFilter": "(member={0})", "rolePrefix": "solr-" }, "authorization": { "class": "com.github.mattweber.solr.security.LdapAuthorizationPlugin", "url": "ldap://your-ldap-server:389", "bindDn": "cn=admin,dc=your-domain,dc=com", "bindPassword": "your-admin-password", "groupSearchBase": "ou=groups,dc=your-domain,dc=com", "groupSearchFilter": "(member={0})", "rolePrefix": "solr-" } }
方案三:自定义LDAP认证处理器
如果上面的方案都不符合你的需求(比如LDAP环境有特殊逻辑),可以自己写一个简单的认证插件:
编写认证类
实现Solr的org.apache.solr.security.AuthenticationPlugin接口,在authenticate方法里调用LDAP服务验证用户凭证(比如用JNDI连接LDAP)。打包部署
把编译好的类打包成jar,放到server/lib/ext目录。配置security.json
在security.json里指定你的自定义类全路径:{ "authentication": { "class": "com.yourcompany.solr.security.CustomLdapAuthPlugin", "ldapUrl": "ldap://your-ldap-server:389", "baseDn": "dc=your-domain,dc=com" // 其他自定义参数 } }
注意事项
- 不管用哪个方案,都要先测试LDAP连接是否正常,比如用
ldapsearch工具验证用户和组的查询逻辑。 - 开启Solr的debug日志(修改
log4j2.xml),方便排查认证失败的原因。 - 如果LDAP用的是SSL(636端口),需要导入LDAP服务器的证书到Solr的JVM信任库。
内容的提问来源于stack exchange,提问作者AnandMishra

