存储Java对象以便在使用REST的WebApp中进一步使用

时间:2016-06-08 07:12:22

标签: java ssh jsch

我有一个webapp,可以通过REST调用各自的功能。 比如,我有一个webapp,用户在其中注册并生成一个KeyValue对,这是在ssh期间进行身份验证所必需的。

现在这个KeyValue对是独一无二的。 而同一个应用程序的另一个网页我希望将这些KeyValue对作为ppk文件下载到ssh。 “因此需要特定的对象”。

有没有办法存放物体。 我有一个Postgres DB 我有什么可能的选择?
编辑:我想要存储的对象是第三方实现的库JSch(这是SSH-2的完整实现),所以简单的Key-Value对可能不是解决方案我猜!)

4 个答案:

答案 0 :(得分:1)

REST是无状态的,所以不可能在服务器端保留它!

您可以创建一个令牌,该令牌是对夫妇密钥的加密,服务器端的值,并将其发送到客户端(浏览器)。

浏览器负责保留令牌并在需要时将其发送到服务器。

服务器可以解密令牌并检索原始键值对。

这将授予您客户端无法访问该密钥值的权限,因为它是以客户端无法读取的方式加密的。

注意如果您只需要在有限的时间内保留这些值,您可以在令牌中加密一个与令牌创建或对令牌的最后访问权限相对应的值。

此技术通常用于在仅使用REST调用的应用程序中保留客户端的“会话”,但需要维护与当前用户相关的信息。

答案 1 :(得分:0)

如果您只想存储单个键/值对,则可以将其存储在会话中。如果您想存储多个对,它的工作方式类似,但您可以在会话中存储集合对。有关详细信息,请查看HttpServletRequest.getSession()。

如果要在所有会话(其他用户,多个浏览器)之间共享键/值对,并且只有一个Web服务器,只需使用静态变量。

如果要在所有会话中共享密钥/值对,并且您有多个服务器,那么您必须将其存储在数据库中(除非您考虑在服务器之间构建一些数据交换协议,但我怀疑这是你能做的最简单的事情。)

答案 2 :(得分:0)

您应该将密钥值对存储在DB中。您可以使用redis更快地访问此对,类似于基于您要设置的到期时间的缓存和自动删除。

这与会话中的服务器缓存数据的方式相同。由于REST API是无日历的,因此您可以使用此备用工具,这应该可以正常工作。

答案 3 :(得分:0)

因为我想要一个关键的ssh'ing到我的机器,由Kech的KeyPair Object提供。我确实通过序列化将它存储在我的数据库中,以用于未来的应用程序,例如

@Entity
@Table(name ="keypairs")
public class KeyPairDomain {

    private Long id;
    private String username;
    private byte[] byteObject;
    private KeyPair keypair;

    public KeyPairDomain(KeyPair kpair, String username) {
        super();
        this.setUsername(username);
        this.keypair = kpair;
    }

    @Transient
    public KeyPair getKeypair() {
        return keypair;
    }


    public void setKeypair(KeyPair complexObject) {
        this.setKeypair(complexObject);
        ByteArrayOutputStream baos;
        ObjectOutputStream out;
        baos = new ByteArrayOutputStream();
        try {
            out = new ObjectOutputStream(baos);
            out.writeObject(complexObject);
            out.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        this.byteObject = baos.toByteArray();
    }

    @Column(columnDefinition = "bytea") 
    public byte[] getByteObject() {
    return byteObject;
    }

    public void setByteObject(byte[] byteObject) {
        ByteArrayInputStream bais;
        ObjectInputStream in;
        try {
            bais = new ByteArrayInputStream(byteObject);
            in = new ObjectInputStream(bais);
            setKeypair((KeyPair) in.readObject());
            in.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        } catch (ClassNotFoundException ex) {
            ex.printStackTrace();
        }
        this.byteObject = byteObject;
    }

    public String getUsername() {
        return username;
    }

    @Column(name = "username")
    public void setUsername(String username) {
        this.username = username;
    }

    @Id
    @GeneratedValue 
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

}

但我将ppk文件存储在任何机器类型的tmp文件夹中。并且在需要时我使用该位置来获取该密钥。

@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_OCTET_STREAM)
@POST
@Path("/getCredentials")
public Response getCredentials(HashMap<String, String> userDetails) {

    String username = userDetails.get("username");
    File homedir = new File(System.getProperty("user.home"));
    File file = new File(homedir, "credentials/" + username + "/Key.ppk");
    System.out.println("File Path: "+file.getAbsolutePath());
    System.out.println("File Name: "+file.getName());
    return Response.ok(file, MediaType.APPLICATION_OCTET_STREAM)
            .header("Content-Disposition", "attachment; filename=" +file.getName()).build();
}