我正在开发一个程序,该程序授权服务器的用户使用生成的密钥来访问它,而我目前正在开发生成部分。服务器的所有者可以指定多少个密钥,服务器ID和密钥的持续时间。我需要存储并检查密钥是否与serverID匹配,以便用户可以使用密钥来获取访问权限。
我唯一想到的是一个复杂的HashMap组合,其中包含另一个HashMap,并且在该HashMap中具有一个List。第一个字符串是每个服务器唯一的服务器ID,列表用于生成的密钥批次,最后的字符串值用于这些密钥的持续时间。
static HashMap<List<String>, String> keyTimeBundle = new HashMap<>();
static List<String> generatedKeys = new ArrayList<>();
static HashMap<String, HashMap<List<String>, String>> clientGeneratedKeys = new HashMap<>();
问题是,当密钥是否与匹配的服务器ID匹配时,我不知道从哪里开始,因为密钥在列表内的另一个HashMap中。我敢肯定还有另一种简单的方法可以实现这一点,但是我还没有想到,所以请不要使用我的方法来解释如何存储和检查值。
答案 0 :(得分:3)
肯定变得笨拙。现在是时候通过一些经过深思熟虑的课程来减少过度增长的时间。在您的程序中给这些概念起个好名字,可以很容易地通过所需的逻辑和数据结构进行推理。
class Id {
String value;
}
class Server {
Id id;
List<Key> keys;
}
class Key {
Id id;
Server server;
Instant expirationDate;
}
每个密钥都有对其所用服务器的引用,每个服务器都有一个可以访问它的密钥列表。与其给密钥束分配失效时间,不如给每个密钥自己的失效时间。创建一批密钥只是意味着创建一堆密钥,并赋予它们相同的到期时间。
Id
类可能只是String
的简单包装,但是由于不必弄清楚哪些String
有什么不同,它使代码更易于阅读。是(它们是ID?名称?)。名称Id
清楚地表明它们是ID字符串。
有了类后,就可以更轻松地考虑所需的其他数据结构。例如,您需要某种全局映射来按ID查找服务器。
public static Map<Id, Server> serversById;
答案 1 :(得分:0)
我建议您实现一个键的POJO表示形式
public class Key{
private String key;
//duration is key specific this gives you more flexibility in issuing temporary individual keys
private long duration;
....
然后将每个服务器密钥列表存储在地图中
HashMap<String, List<Key>> clientGeneratedKeys = ...
至于检查,请检查服务器的密钥列表中是否包含已提交的密钥(不要忘记根据比较“ key”属性来实现与之相等的Key类)
clientGeneratedKeys.get("Server Id").contains("submitted key");
您需要在上一行代码中进行一些空安全检查
答案 2 :(得分:0)
非常简单的不同方法只能使用res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Content-Type', 'text/javascript; charset=utf-8');
res.end(`(function(){
//Some JavaScript Code
var foo="${bar}";
console.log("This a JavaScript file generated with Jade");
})()`);
。
您可以将密钥作为
HashMap<String,String>
,其值作为该密钥在该特定服务器中的持续时间。
在搜索时,只需将serverId和键连接起来,并检查持续时间即可。