2016-06-08 2 views
0

У меня есть webapp, который делает вызов REST для соответствующих функций. Скажем, у меня есть webapp, в котором пользователь регистрируется и генерируется пара KeyValue, которая требуется для аутентификации во время ssh.

Теперь эта пара KeyValue уникальна. И другая веб-страница того же приложения. Я хочу, чтобы эти пары KeyValue загружались как ppk-файл в ssh. «Так что требуется конкретный объект».

Так есть способ хранения объекта. У меня есть DB Postgres.
Каковы мои возможные варианты?
Edit: Объект Я хочу сохранить, является третьей стороной реализована библиотека JSch (которая является полная реализация SSH-2), так что просто пара ключ-значение не может быть решение, я думаю)Сохранение объектов Java для дальнейшего использования в WebApp, использующем REST

+0

Выполните одно из ответов работать для вашего сценария? – Prateek

+0

Я сохранил его на сервере и в БД также для будущей цели. Я получил за простое и прямое решение –

+0

Можем ли мы обсудить ваше решение – Prateek

ответ

0

Как я хотел получить ключ для ssh'ing в мою машину, которая предоставляется объектом KeyPair объекта JSch.Я хранил его в своей базе данных сериализации для будущих приложений, как это,

@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; 
    } 

} 


но хранится файл ППК в 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(); 
} 
0
!

Если вы хотите сохранить только одну пару ключ/значение, вы можете сохранить ее в сеансе. Если вы хотите хранить несколько пар, он работает аналогично, но вы должны хранить набор пар в сеансе. Посмотрите на HttpServletRequest.getSession() для деталей.

Если вы хотите разделить пару ключ/значение на всех сеансах (другие пользователи, несколько браузеров), и у вас есть только один веб-сервер, просто используйте статическую переменную.

Если вы хотите разделить пару ключ/значение на всех сеансах, и у вас есть несколько серверов, тогда вам нужно будет сохранить их в базе данных (если только вы не захотите создать некоторый протокол обмена данными между серверами, но я сомневаюсь, что это было бы самое простое, что вы могли бы сделать).

+1

REST является апатридом. Это означает отсутствие сеанса. –

+1

Сессия здесь не является вариантом. Но сохранение в DB кажется вариантом. –

+1

Сессия является частью webapp, а не службы REST, вызываемой webapp. Служба, являющаяся RESTful (и, следовательно, без гражданства), не означает, что webapp также является апатридом. Утверждение Аакаша о том, что сеанс не является опцией, ясно показывает это. –

1

ОТДЫХ является апатридом, поэтому его невозможно на стороне сервера!

Вы можете создать токен, который является шифрованием ключа пары, значение на стороне сервера и отправить его клиенту (браузеру).

Браузер несет ответственность за предоставление токена и отправку его на сервер, если это необходимо.

Сервер может расшифровать токен и получить исходную пару значений ключа.

Это предоставит вам, что клиент не может получить доступ к значению ключа пары, поскольку он зашифрован таким образом, что клиент не может его прочитать.


Примечание Если вам необходимо его поддерживать эти значения только для ограниченного количества времени, которое вы можете зашифровать в маркере также значении, соответствующее создание маркеров или последний доступ к маркеру.

Этот метод обычно используется для обслуживания сеансов на стороне клиента в приложении, которое использует только вызовы REST, но нуждается в обслуживании информации, относящейся к текущему пользователю.

+0

Davide. Проблема в том, что если браузер будет поддерживать объект, тогда я думаю, что вы предлагаете LocalStorage или SessionStorage, но его можно изменить и изменить, то есть он доступен, но не читается. Так что это может быть не очень хорошая идея для проекта IMO. –

+0

Его нельзя изменить, поскольку он зашифрован с помощью закрытого ключа, и изменение на это приведет к недействительности самого токена. –

+0

Это проблема, если она становится недействительной, тогда она становится бесполезной, когда я буду ее требовать. Или есть еще? –

0

Вы должны сохранить пару значений ключа в БД. Вы можете использовать redis для более быстрого доступа к этой паре, похожей на кеш, и автоматического удаления в зависимости от времени истечения, которое вы хотите установить.

Точно так же данные кэшируются серверами в сеансах. Поскольку API-интерфейсы REST не имеют данных, у вас есть этот альтернативный вариант, который должен работать нормально.

Смежные вопросы