【发布时间】:2021-04-05 06:11:13
【问题描述】:
我们有一项照片共享服务,可以允许或拒绝其他用户查看或不查看。我们将此服务公开为 API /view?caller=userId&photoId=photoId。我们正在使用 AWS Neptune Graph 数据库服务来维护此授权并使用 tinkerpop java 库。
为了代码的可维护性,我们从其他类方法中获取可能的路径,并从外部调用canUserView方法。
Public class Authorizer {
List<Role> roles;
public Authorizer(List<Role> roles) {
this.roles = roles;
}
public boolean canUserView(User user, String photoId) {
return graph.V(user.getId()).hasLabel("user").or(getPossibleTraversals(user)).hasId("photoId")
}
private GraphTraversal<Object, Vertex>[] getPossibleTraversals(User user) {
List<GraphTraversal<Vertex, Vertex>> traversals = roles.getTraversal(user).map(traversal -> traversal).collect(Collectors.toList())
return traversals.toArray(GraphTraversal[]::new);
}
}
并且在角色类 getTraversal 中用于代码性能,根据用户信息我提供所需的遍历或者我可以提供故障遍历。
现在的问题是如何在这里提供故障遍历。现在我们假设一些不可用的顶点 ID 用于故障遍历。代码如下。
public class Role {
public GraphTraversal<Object, Vertex> getTraversal(User user) {
if(user.satisfies(this)) {
return __.V("assumedUnavailableVertexId").hasLabel("absolutelynotpossible"); //This ID and label assumed
} else {
return actualTraversal(); //This will construct the possible traversals
}
}
}
如何返回Role中if case的失败遍历?有什么办法可以消除这个假设?
【问题讨论】:
-
我不确定我是否完全理解您的问题。您是否要求一种简单的方法来返回指示失败的遍历?我经常看到在这种情况下使用像
constant('Not allowed')这样简单的东西。 -
是的,我需要遍历失败的东西。
-
.constant("Not allowed") 的问题是,.constant() 的返回类型是 GraphTraversal
。在成功的情况下,它将是 GraphTraversal -
这种情况下你能接受
Traversal <Object,Object>吗?在 Gremlin 中,根据所采用的分支,遍历可能会产生不同的结果,这一点并不少见。 -
我想没问题。 .constant("NotAllowed") 将在这里工作。有时很难遵守 Sonarqube 规则。 rules.sonarsource.com/java/RSPEC-1452。谢谢@KelvinLawrence