Solr在5.0版本后,不再提供war包部署的方式,取而代之的是内置了jetty服务,
但是我们发现其中并没有内置任何安全性相关检查,任何人如果知道了我们的外网地址就能直接访问并修改其中的索引。经过查找可以使用jetty的方式来限制web访问。
solr/server/solr-webapp/WEB-INF/web.xml中增加以下字段:
<security-constraint> <web-resource-collection> <web-resource-name>solr</web-resource-name> <url-pattern>/</url-pattern> </web-resource-collection> <auth-constraint> <role-name>solr_admin</role-name> <role-name>admin</role-name> </auth-constraint> <login-config> <auth-method>BASIC</auth-method> <realm-name>Solr Admin</realm-name> </login-config> </security-constraint>
配置验证方式BASIC(用户名密码的方式)。
solr/server/etc/jetty.xml中增加Call标签:
<Call name="addBean"> <Arg> <New class="org.eclipse.jetty.security.HashLoginService"> <Set name="name">Solr Admin</Set> <Set name="config"> /Users/mazhiqiang/develop/tools/solr-5.5.0/server/etc/realm.properties </Set> <Set name="refreshInterval">0</Set> </New> </Arg> </Call>
config中指定密码文件的路径,可以在其中使用<SystemProperty>来共同组合路径,例如配置了环境变量的情况下,可以使用下面的方式:
<Set name="config"><SystemProperty name="jetty.home" default="."/>/etc/realm.properties</Set>
而指定的realm.properties就是相关密码文件了:
admin:xxxx,solr_admin
设置完成,重新启动solr即可,如果不输入用户名和密码,无法登陆成功:
注意该方法同样会影响HttpSolr连接以及SolrCloud连接,报出下面的错误:
{"code":500,"codeMsg":"Error from server at http://xxx:8983/solr/brand: Expected mime type application/octet-stream but got text/html. <html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"/>\n<title>Error 401 Unauthorized</title>\n</head>\n<body><h2>HTTP ERROR 401</h2>\n<p>Problem accessing /solr/brand/select. Reason:\n<pre> Unauthorized</pre></p><hr><i><small>Powered by Jetty://</small></i><hr/>\n\n</body>\n</html>\n"}
我们可以使用简单验证的方式来测试一下:
URL url = new URL("http://xxxx:8983/solr/"); String encoding = Base64.encode("admin:xxxx".getBytes()); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.setDoOutput(true); connection.setRequestProperty ("Authorization", "Basic " + encoding); InputStream content = (InputStream)connection.getInputStream(); BufferedReader in = new BufferedReader (new InputStreamReader(content)); String line; while ((line = in.readLine()) != null) { System.out.println(line); }
如果加上credentials,是可以成功地将结果html打印出来,否则提示401(Unauthorized)错误。
此时使用SolrCloud的情况下,就不能用CloudSolrClient中内置的httpClient,而只能在外部声明并传入,顺带建立CredentialsProvider,用于Basic权限验证:
String zkHost = PropertiesUtil.getProperty("zkhost", PROPERTY_FILE_NAME); String collection = PropertiesUtil.getProperty(collectionName.getConfigName(), PROPERTY_FILE_NAME); int zkClientTimeout = StringUtils .parseInt(PropertiesUtil.getProperty("zkClientTimeout", PROPERTY_FILE_NAME)); int zkConnectTimeout = StringUtils .parseInt(PropertiesUtil.getProperty("zkConnectTimeout", PROPERTY_FILE_NAME)); PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(); // 连接池最大连接数 connManager.setMaxTotal(50); // 每个路由最大连接数 connManager.setDefaultMaxPerRoute(20); // http请求配置信息 RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(2000).setSocketTimeout(2000) .setConnectionRequestTimeout(500).setCookieSpec(CookieSpecs.STANDARD) .build(); CredentialsProvider credentialsProvider = new BasicCredentialsProvider(); credentialsProvider.setCredentials(new AuthScope(PropertiesUtil.getProperty("solrHost", PROPERTY_FILE_NAME), Integer.parseInt(PropertiesUtil.getProperty("solrPort", PROPERTY_FILE_NAME))), new UsernamePasswordCredentials(PropertiesUtil.getProperty("solrUserName", PROPERTY_FILE_NAME), PropertiesUtil.getProperty("solrPassword", PROPERTY_FILE_NAME))); CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(connManager).setDefaultRequestConfig(requestConfig) .setConnectionManagerShared(true).setDefaultCredentialsProvider(credentialsProvider).build(); CloudSolrClient cloudSolrClient = new CloudSolrClient(zkHost, httpClient);
此时就可以像以前一样正常查询了,注意在已经添加Credentials情况下,如果此时服务器不需要验证,也不会出错。
对定时full/delta-import的影响
如果增加了安全校验,同样也会影响full-import, delta-import的执行,此时从solr.log日志中就可以拿到错误的信息:
2016-08-29 09:10:41.925 INFO (Timer-0) [ ] o.a.s.h.d.s.BaseTimerTask [product] <index update process> Process started at .............. 29.08.2016 09:10:41 925 2016-08-29 09:10:41.948 INFO (Timer-0) [ ] o.a.s.h.d.s.BaseTimerTask [product] <index update process> Full URL http://localhost:8983/solr/product/dataimport?command=delta-import&clean=false&commit=true 2016-08-29 09:10:41.958 INFO (Timer-0) [ ] o.a.s.h.d.s.BaseTimerTask [product] <index update process> Response message Unauthorized 2016-08-29 09:10:41.958 INFO (Timer-0) [ ] o.a.s.h.d.s.BaseTimerTask [product] <index update process> Response code 401 2016-08-29 09:10:41.986 INFO (Timer-0) [ ] o.a.s.h.d.s.BaseTimerTask [product] <index update process> Disconnected from server localhost 2016-08-29 09:10:41.986 INFO (Timer-0) [ ] o.a.s.h.d.s.BaseTimerTask [product] <index update process> Process ended at ................ 29.08.2016 09:10:41 986
在full-import/delta-import的相关代码中,没有涉及到权限验证部分,直接使用http连接:
protected void sendHttpPost(String completeUrl, String coreName) { DateFormat df = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss SSS"); Date startTime = new Date(); // prepare the core var String core = coreName == null ? "" : "[" + coreName + "] "; logger.info(core + "<index update process> Process started at .............. " + df.format(startTime)); try { URL url = new URL(completeUrl); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("POST"); conn.setRequestProperty("type", "submit"); conn.setDoOutput(true); // Send HTTP POST conn.connect(); logger.info(core + "<index update process> Full URL\t\t\t\t" + conn.getURL()); logger.info(core + "<index update process> Response message\t\t\t" + conn.getResponseMessage()); logger.info(core + "<index update process> Response code\t\t\t" + conn.getResponseCode()); // listen for change in properties file if an error occurs if (conn.getResponseCode() != 200) { reloadParams(); } conn.disconnect(); logger.info(core + "<index update process> Disconnected from server\t\t" + server); Date endTime = new Date(); logger.info(core + "<index update process> Process ended at ................ " + df.format(endTime)); } catch (MalformedURLException mue) { logger.error("Failed to assemble URL for HTTP POST", mue); } catch (IOException ioe) { logger.error( "Failed to connect to the specified URL while trying to send HTTP POST", ioe); } catch (Exception e) { logger.error("Failed to send HTTP POST", e); } }
这种方式同样需要增加权限验证, 在conn执行连接之前,要设置认证选项:
String encoding = Base64.encode(“username:password".getBytes()); conn.setRequestProperty("Authorization", "Basic " + encoding);
注意当前使用的仅仅是硬编码设置的用户名、密码,修改完成后,要将原有的jar包(apache-solr-dataimportscheduler-1.0.jar)进行重新编译并替换,重启solr服务即可。
使用内置的HttpSolrClient
即并不传入原来的,还有另外一种方法,可用于配置基本用户以及密码认证,在HttpClientConfigurer类中对DefaultHttpClient的参数进行配置时,使用了下面的属性配置:
final String basicAuthUser = config .get(HttpClientUtil.PROP_BASIC_AUTH_USER); final String basicAuthPass = config .get(HttpClientUtil.PROP_BASIC_AUTH_PASS);
如果使用这种方式,那么在创建内置的HttpSolrClient时需要传入params,在params中加入基本认证即可。
ModifiableSolrParams params = new ModifiableSolrParams(); params.set(HttpClientUtil.PROP_MAX_CONNECTIONS, 128); params.set(HttpClientUtil.PROP_MAX_CONNECTIONS_PER_HOST, 32); params.set(HttpClientUtil.PROP_FOLLOW_REDIRECTS, false); params.set(HttpClientUtil.PROP_BASIC_AUTH_USER, "admin"); params.set(HttpClientUtil.PROP_BASIC_AUTH_PASS, "zhen.com"); params.set(HttpClientUtil.PROP_MAX_CONNECTIONS, 1000); params.set(HttpClientUtil.PROP_ALLOW_COMPRESSION, true); params.set(HttpClientUtil.PROP_MAX_CONNECTIONS_PER_HOST, 1000); CloseableHttpClient closeableHttpClient = HttpClientUtil.createClient(params); HttpSolrClient solrClient = new HttpSolrClient(solrurl, closeableHttpClient);
同样的方法也适用于CloudSolrClient。
相关推荐
在 Solr 8 中,为了确保系统的安全性和数据的隐私性,配置用户登录验证是非常重要的步骤。本文将详细介绍如何对手动配置 Solr 8 的用户登录验证。 首先,我们需要了解 Solr 的安全组件——Jetty 容器。Solr 默认...
Linux操作系统以其稳定性和安全性被广泛用于服务器部署,Solr 7.7.3 版本优化了在Linux上的运行性能,与系统资源的集成更加紧密。在Linux环境下,Solr可以通过启动脚本轻松管理,如使用`systemd`服务或传统的`init....
Tomcat7支持Basic认证和其他形式的身份验证,可以通过修改`conf/tomcat-users.xml`添加用户和角色。 **七、监控和性能优化** 整合后的Solr可以通过Tomcat的监控工具进行监控,例如使用JMX(Java Management ...
2023年全国大学生英语竞赛样题(C类)样题答案及听力原文
出纳考核表
基于多种天气因素的光伏电站太阳能辐射量预测系统——采用人工神经网络与离线优化算法,MATLAB代码:考虑多种天气条件下光伏电站太阳能辐射量预测 关键词:辐射量预测 光伏预测 多种天气因素 参考文档:《Solar Radiation Prediction and Energy Allocation for Energy Harvesting Base Stations》 仿真平台:MATLAB+CPLEX 平台 优势:代码具有一定的深度和创新性,注释清晰,非烂大街的代码,非常精品 主要内容:代码主要做的是如何利用预测光伏电站太阳能辐射量的问题,利用人工神经网络对对其内太阳辐射量进行预测,并对无云天气以及多云天气进行了分别讨论,与线性模型相比该模型具有更好的性能,除此之外,代码还研究了太阳能的分配问题,采用离线优化算法和四种在线启发式算法分别进行分配策略的优化,并利用太阳辐射数据评估了算法的性能。 该代码适合新手学习以及在此基础上进行拓展,代码质量非常高,出图效果极佳 ,核心关键词: 1. 光伏电站太阳能辐射量预测 2. 多种天气因素 3. 人工神经网络 4. 预测模型 5. 线性
数据结构实验实习指导书(c语言)
"lyh不会打代码"生存小有戏改版
站群系统/泛目录站群源码/泛站群cms系统【小说泛目录站群源码】 效果截图和演示https://www.lxsjfx.cn/3181.html 绿茶小说站群2.x-秒收隔天速出权重-小说流量稳定收割机-精品轻量级PHP站群系统站群系统,小说行业专用引流精品站群,绿茶小说站群为独立站群系统(无需依托CMS),独立的整篇小说优化内容库(拒绝句子拼凑),模板自适应PC端和移动端,流量一起做! 1、绿茶小说站群为独立站群系统(无需依托CMS) 2、对域名要求不高,百元域名均可操作 3、独立的首页、列表页、小说阅读页 4、独立的整篇小说优化内容库(拒绝句子拼凑) 5、可自定页面后缀(html、shtml、xml…..) 6、拒绝全站404跳转到内容页 7、还有强大的网站XML地图功能,便于链接提交 8、模板自适应PC端和移动端,流量一起做! 站群系统/泛目录站群源码/泛站群cms系统【小说泛目录站群源码】
IQC检验员(来料检验员)绩效考核表
2024年全球AI应用趋势年度报告
安全生产绩效考核表
04-【标准制度】公司 KPI 绩效考核流程
第14讲:深入理解指针(4)
考虑用户舒适度的冷热电多能互补综合能源系统优化调度模型:结合PMV衡量与碳排放交易机制的MATLAB仿真实现,考虑用户舒适度的冷热电多能互补综合能源系统优化调度 MATLAB代码:考虑用户舒适度的冷热电多能互补综合能源系统优化调度 关键词:用户舒适度 综合能源 PMV 优化调度 参考文档:《冷热电气多能互补的微能源网鲁棒优化调度》基础模型加舒适度部分模型; 仿真平台:MATLAB+yalmip+cplex 主要内容:代码主要做的是考虑用户舒适度的冷热电多能互补综合能源系统优化调度模型,在传统的冷热电联供型综合能源系统的基础上,进一步考虑了热惯性以及用户的舒适度,并用预测平均投票数PMV对用户的舒适度进行衡量,且通过改变PMV的数值,可以对比不同舒适度要求对于综合能源系统调度结果的影响。 同时,代码还补充性的考虑了碳排放交易机制,并设置经济性最优以及碳排放最优两种对比场景,从而丰富算例,效果非常明显。 使用matlab+yalmip+cplex进行代码的 ,考虑用户舒适度; 综合能源系统; PMV; 优化调度; 冷热电多能互补; 碳排放交易机制。,考虑用户舒适度与碳排放交易的冷热电多能
内容概要:本文详细阐述了利用ANSI转义码在Xshell脚本中进行光标的灵活操控方法。介绍了从光标的隐藏、定位(特定行/列)、保存位置、复位、清除以及显示控制的基本命令,重点描述了如何使用以上提到的功能构建实用的UI组件——文本模式下工作的进度条。文中提供的简单实例演示了一个完整的循环逻辑,它能动态刷新视图,在每一次迭代中根据程序实际进展更新屏幕上的表现形式,同时保持界面美观性和易读性。并且提到由于不同的终端可能有不同的兼容情况,脚本的跨环境行为可能存在细微差别。 适合人群:初学者至中级水平的技术爱好者或者软件开发者,尤其是希望深入掌握Linux环境下命令行工具使用者。 使用场景及目标:① 学习并理解Xshell脚本里涉及的ANSI转义码概念和技术点,从而增强对终端界面元素(如菜单、提示符等)的操作技能;② 掌握通过程序手段构造动态变化的CLI应用程序技巧,比如实时跟踪长时间任务的状态; 阅读建议:本文不仅包含了具体命令的学习,更展示了它们是如何组合起来创造复杂视觉反馈机制的案例研究。对于想进一步探索终端开发领域的程序员而言,这无疑提供了很好的入门指引材料。考虑到各种操作系统上支持度的问题,在测试代码之前应当确认自己的工作平台已经正确配置好。
内容概要:该文档详细探讨了针对达梦数据库的各种性能优化技术和处理方法。具体包括回表问题及其解决措施如覆盖索引和FAST POOL机制;变量窥探、统计数据收集优化方法,例如设置统计桶数量和采样子表数目;视图上拉、JOIN优化、EXISTS与NOT EXISTS子查询重写策略;分区裁剪和多KEY哈希等方面的深入探讨,提供了多个具体的优化技巧,旨在帮助用户有效提升SQL执行性能,并解决了多种可能导致性能下降的关键因素。 适合人群:数据库管理员、运维工程师及具有一定经验的数据开发人员等,尤其是负责使用和维护基于达梦数据库系统的技术团队成员。 使用场景及目标:适用于希望通过改善查询速度来提高系统响应时间的专业人士;需要处理大型数据库或复杂查询的任务;或是正在寻找改进现有数据库架构的方法的机构。它还特别针对那些希望确保最优硬件资源利用率的人群。 其他说明:本文档不仅介绍了理论性的背景知识和技术细节,还包括了大量的实际案例演示和参数调整建议,方便读者理解和实践这些优化方法。此外,针对每种优化策略提供了详细的指导,使得即使是对某些高级特性较为陌生的读者也能顺利掌握关键技能。
54 -营销部经理绩效考核表1
外贸部绩效考核表格