- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的应用程序基于 Java 的 Play 框架。我通过简单地将相同的应用程序部署到多个服务器上并在它们之间相应地分发 Web 请求来使其分布式。每个节点都将连接到同一个数据库。
Play 框架已经使用 Netty,因此我可以选择使用 HTTP 请求在节点之间进行通信,但我不确定如何保护其中一些请求,以便可以从浏览器调用其中一些请求,即我使用框架的网站仍然可以调用某些路由/api端点,而某些路由/api端点受到限制,只能由集群中的其他节点调用,以便节点之间可以通信。
这是一个我希望公开访问的示例 Controller
public class TestController extends Controller {
public static Result create() {
JsonNode json = request().body().asJson();
if (json == null) return badRequest("Invalid JSON!");
Testmodel model = JsonHelper.fromJson(json.toString(), Testmodel.class);
if (model == null) return badRequest("JSON does not conform to model!");
MongoHelper.getInstance().getDatastore().save(model);
return ok(JsonHelper.toJson(model));
}
public static Result addOneTest() {
Testmodel somemodel = new Testmodel();
somemodel.setName("name" + Math.random());
somemodel.setValue("val" + Math.random());
MongoHelper.getInstance().getDatastore().save(somemodel);
return ok(JsonHelper.toJson(somemodel));
}
public static Result getAllTest() {
List<Testmodel> all = MongoHelper.getInstance().getDatastore().find(Testmodel.class).asList();
return ok(JsonHelper.toJson(all));
}
public static Result getCountTest() {
long count = MongoHelper.getInstance().getDatastore().getCount(Testmodel.class);
return ok(Long.toString(count));
}
public static Result deleteAllTest() {
Datastore ds = MongoHelper.getInstance().getDatastore();
WriteResult result = ds.delete(ds.createQuery(Testmodel.class));
return ok(JsonHelper.toJson(result));
}
}
这里是该 Controller 的示例路由/API 端点
POST /api/test/create controllers.TestController.create()
POST /api/test/add controllers.TestController.addOneTest()
DELETE /api/test/delete controllers.TestController.deleteAllTest()
GET /api/test/get controllers.TestController.getAllTest
GET /api/test/count controllers.TestController.getCountTest
这是一个我不想要公开访问的 Controller 的示例,即我只希望集群中的节点能够使用它,以便它们可以通过 HTTP 请求相互通信并从另一个节点运行某些方法或将数据传递到另一个节点。出于安全目的,对公共(public)可访问性的限制是显而易见的,我不希望网站上的人访问此 Controller 的任何路由。
public class NodeController extends Controller {
public static Result runJob(ObjectId jobId) {
Submission submission = MongoHelper.getInstance().getDatastore().get(Submission.class, jobId);
if (submission == null) {
return badRequest("No job with that id");
}
// TODO Do some more error checking and validation on the submission
JobRunner.getInstance().run(jobId);
return ok();
}
public static Result cancelJob(ObjectId jobId) {
boolean cancelled = JobRunner.getInstance().cancel(jobId);
if (cancelled) return ok();
else return badRequest("Example error");
}
}
我能找到的保护这些的唯一选择是使用 Play Framework's Allowed Hosts Filters ,这使得框架仅接受来自指定主机的 HTTP 请求,但问题是这应用了全面过滤器,即所有请求都将受到限制,即使是那些我希望公开访问的请求。
我读到的另一个选项是 Java 远程方法调用 (RMI),但我是初学者,所以这对我来说可能有点困难。该项目也相当小且简单,所以我担心这可能有点矫枉过正。正如您在上面的示例(特别是 NodeController)中看到的,我所需要的只是让节点从另一个节点调用一两行代码。
我设法使用操作组合将给定 Controller 仅限制为预先配置的源地址,如下所示:
public class SourceAddressFilter extends Action<SourceAddressFilter> {
private static final org.slf4j.Logger LOGGER = play.Logger.underlying();
private static final List<String> allowedAddresses =
Configuration.root().getStringList("nodes.allowedSourceAddresses");
@Override
public CompletionStage<Result> call(Http.Context ctx) {
String srcAddress = ctx.request().remoteAddress();
if (!allowedAddresses.contains(srcAddress)) {
LOGGER.error("Address {} attempted to perform action, but is not in the list of allowed hosts!", srcAddress);
return CompletableFuture.completedFuture(badRequest("Address " + srcAddress + " is not authorized!"));
}
return delegate.call(ctx);
}
}
然后在每个 Controller 的开头添加以下注释:
@With(SourceAddressFilter.class)
它确实有效,尽管我有点担心这是一种多么好的方法,以及是否有可能以某种方式在请求中伪造这个方法,或者只是通过在操作中调用 request().remoteAddress() 来接收错误的方法.
我仍然有兴趣知道是否可以按照答案中的建议使用 JWT 来完成,但我不知道如何实现。
最佳答案
您应该使用JWT并使用 token + action composition 管理您的身份验证.
JWT 允许您创建可在应用程序之间共享的签名 token 。
关于java - 如何在 Play Framework for Java 的分布式集群中实现安全的节点间通信?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43229323/
我正在使用 JavaFX 8 创建一个应用程序。我使用拖/放动态更改网格 Pane 的内容。我希望每行或每行/列迭代 GridPane 内容。JavaFX 允许通过指定行和列在 GridPane 中添
我正在尝试将图像拖放到div上。图像没有被拖到div上并给出以下错误 Uncaught TypeError: Failed to execute 'appendChild' on 'Node': pa
我正在 android studio 中创建内部构建 AR 导航。我正在寻找一种方法将 anchor 与其他 anchor 或 anchor 节点/节点“连接”起来。我不确定使用哪一个。基于我将强制用
我在 Hive 上运行一些作业:首先是 4 节点,然后是 2 节点。令我惊讶的是,我的 2 节点性能比我的 4 节点更好。 首先,我在一个 4 节点(4 个事件节点)上运行查询,然后关闭 2 个节点(
我有 Node* current ,我在其中存储指向列表“顶部”当前节点的指针。当我将一个新节点设置为当前节点时,出现错误: '=' : cannot convert from 'CircularDo
我是 dcos Mesos 的新手,在本地 Ubuntu 机器上安装了 dc os。 我可以查看 dcos 仪表板。 但我无法使用 dcos node ssh --master-proxy --lea
在 JavaFX 中,是否有类似 setLayout(); 的东西?或 setBounds(); ? 例如,我想将按钮定位到我想要的位置。 最佳答案 JavaFX 场景图上的所有内容都是 Node .
我正在开发一个 JavaFX 应用程序,其中我开发的类(从 javafx.scene.Parent 扩展)是根据用户在 ListView 控件中单击的条目动态创建的。 只是要清楚这个节点,它不是使用像
我正在尝试为节点-边缘关系创建一个类图,因为它可以在有向图中找到。我想传达的是,Nodes 引用了 Edges,Edges 也引用了 Nodes。每个 Edge 都恰好需要两个 Node(源和目标)。
在mapreduce作业期间,单个任务将在随机节点上运行,是否有任何方法限制应在其中运行任务的节点? 最佳答案 Hadoop不会选择节点来随机运行任务。考虑到数据局部性,否则将有很多网络开销。 任务与
有什么区别: a) nodetool 重建 b) nodetool 修复 [-pr] 换句话来说,各个命令到底是做什么的? 最佳答案 nodetool重建:类似于引导过程(当您向集群添加新节点时),但
我已将第一个 OneToMany 关系添加到我的 hibernate 3.6.10 项目中。这是一个类: /** * */ package com.heavyweightsoftware.leal
是否有可能找到正在监听触发当前函数的事件的元素? 在下面的代码中,event.target 返回 #xScrollPane 和 event.currentTarget 和 event 的最低子节点.f
我正在尝试覆盖我数据库中的一些数据。结构很简单,就是: recipes { user_1{ recipe_1{data} recipe_2{data} } user_2{
我使用 setInterval 来运行该函数,但它会多次执行函数 2... 如何在输入中插入一个值后执行函数 第一个输入与其余输入的距离不同 如何在插入 val(tab 选项)后将插入从 1 个输入移
我不知道代码有什么问题,但在 visual studio 中不断收到这些错误消息。 Error 18 error C1903: unable to recover from previous e
我正在尝试从其类中获取 SharePoint 搜索导航节点的对象。 var nodes = $("div.ms-qSuggest-listItem"); 我正在获取节点对象,现在想要获取“_promp
D:\nodeP>node main.js module.js:327 抛出错误; ^ 错误:在 Function.Module 的 Function.Module._resolveFilename
struct node{ int key, prior, cnt, val; node *l, *r; node(){} node(int nkey) : key(nkey),
我有以下代码使用迭代器将项目插入双链表。这就是我们被要求这样做的方式。代码有效,但问题是我有 24 字节的绝对内存泄漏。 NodeIterator insert(NodeIterator & itrP
我是一名优秀的程序员,十分优秀!