首页 > 编程知识 正文

java创建接口实现类,创建ftp后无法访问

时间:2023-05-06 15:21:09 阅读:235879 作者:605

在之前我的文章 “Elastic:使用Postman来访问Elastic Stack” 中我介绍了如何在应用中访问 Elasticsearch。在那里,我们使用了最基本的 Basic authentication 的方法来访问 Elasticsearch。这种方法不好的地方就是每个用户所有的请求的验证都是一样的:使用的是同样的一个用户名及密码的 Base64 编码。在今天的文章中,我们将介绍如何创建 API key 来提供对 Elasticsearch 的访问。通过这个方法,一个用户可以动态生成无数个 API Key 的访问。 官方文档,可以在链接找到。

创建 API key 接口访问 Elasticsearch

接口

它的接口非常简单:

POST /_security/api_keyPUT /_security/api_key

API Key 由 Elasticsearch API key 服务创建,当您在 HTTP 接口上配置 TLS 时,该服务会自动启用。 请参阅加密 HTTP 客户端通信。 或者,你可以显式启用  xpack.security.authc.api_key.enabled 设置。 在生产模式下运行时,引导检查会阻止您启用 API key 服务,除非你还在 HTTP 接口上启用了 TLS。

成功创建 API key API 调用将返回一个 JSON 结构,其中包含 API 密钥,其唯一 ID 和名称。 如果适用,它还以毫秒为单位返回 API 密钥的到期信息。

有点是需要注意的是:默认情况下,API 密钥永不过期。 你可以在创建API密钥时指定到期信息。

请求例子

以下示例创建一个 API 密钥:

POST /_security/api_key{ "name": "my-api-key", "expiration": "1d", "role_descriptors": { "role-a": { "cluster": ["all"], "index": [ { "names": ["index-a*"], "privileges": ["read"] } ] }, "role-b": { "cluster": ["all"], "index": [ { "names": ["index-b*"], "privileges": ["all"] } ] } }}

请注意:在上面的 expiration 和 role_descriptors 这两个字段是可选的。如果你不选则意味着永远有效,并对所有的 role 都起作用。

接下来,我们来用一个具体的例子来展示这项功能。

安装

针对这个测试,由于要求我们启用 TLS 的配置,请参阅我之前的文章 “Elastic:为 Elasticsearch 启动 https 访问” 。你也参考我的另外一篇文章 “Security:如何安装 Elastic SIEM 和 EDR” 来安装 https。在那篇文章中,我详述了如何配置启用 TLS。如果你的配置是成功的话,那么我们的 Elasticsearch 将会运行于 https://localhost:9200 的端口上。在这里,我就不再累述了。

测试

我们首先来打开 Kibana,并输入如下的命令:

POST /_security/api_key{ "name": "liuxg-api-key", "expiration": "1d"}

在这里,我们设置 API key 的有效期是1天。我们同时也给了一个名称 liuxg-api-key。执行完上面的指令后,我们可以看到如下的响应:

{ "id" : "gBcXKHMB53qZFLAQ52-j", "name" : "liuxg-api-key", "expiration" : 1594191922072, "api_key" : "sJYv3VMLRaaeaoUec2XfsA"}

在这里,expiration 使用一个数值来表示的。它表示是从 1970-01-01 00:00:00 UTC 算起的秒。具体描述可以参阅文章。

我们可以使用两种方法来生产这个 ApiKey:

方法一:

我们最关心的就是返回来的 id 及 api_key。这两个数值并不能直接为我们所使用。我们打开网站:https://www.base64encode.org/,并把上面的 id 及 api_key 用分号分开:

请注意返回的值 Z0JjWEtITUI1M3FaRkxBUTUyLWo6c0pZdjNWTUxSYWFlYW9VZWMyWGZzQQ==。这个将是我们访问 Elasticsearch 所需要的最终的 ApiKey。

方法二:

我们打开一个 terminal 并创建如下的一个 叫做 response 文件,它的内容如下:

{ "id" : "gBcXKHMB53qZFLAQ52-j", "name" : "liuxg-api-key", "expiration" : 1594191922072, "api_key" : "sJYv3VMLRaaeaoUec2XfsA"} $ cat response { "id" : "gBcXKHMB53qZFLAQ52-j", "name" : "liuxg-api-key", "expiration" : 1594191922072, "api_key" : "sJYv3VMLRaaeaoUec2XfsA"}

接着我们在 response 文件所在的路径下打入如下的命令:

$ echo -n $(cat response | jq -r .id):$(cat response | jq -r .api_key) | base64

上面的命令显示的结果:

$ ls response responseliuxg:tmp liuxg$ echo -n $(cat response | jq -r .id):$(cat response | jq -r .api_key) | base64Z0JjWEtITUI1M3FaRkxBUTUyLWo6c0pZdjNWTUxSYWFlYW9VZWMyWGZzQQ==

通过这个方法,我们可以看到和方法一一样的效果。

方法三:

我们也可以在 terminal 中打入如下的方法:

printf 'gBcXKHMB53qZFLAQ52-j:sJYv3VMLRaaeaoUec2XfsA' | base64

我们使用 : 符号把 ID 和 api_key 分开。上面的命令显示的结果为:

printf 'gBcXKHMB53qZFLAQ52-j:sJYv3VMLRaaeaoUec2XfsA' | base64Z0JjWEtITUI1M3FaRkxBUTUyLWo6c0pZdjNWTUxSYWFlYW9VZWMyWGZzQQ==

显然它和上面的结果是一样的。

使用 ApiKey

我们访问 Elasticsearch 所使用的 接口例子为:

curl -k -H "Authorization: ApiKey Z0JjWEtITUI1M3FaRkxBUTUyLWo6c0pZdjNWTUxSYWFlYW9VZWMyWGZzQQ==" https://localhost:9200/_cluster/health

运行上面的命令:

我们再来运行一个例子:

curl -k -H "Authorization: ApiKey Z0JjWEtITUI1M3FaRkxBUTUyLWo6c0pZdjNWTUxSYWFlYW9VZWMyWGZzQQ==" https://localhost:9200/_cat/indices?pretty

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。