Как отобразить отношения между двумя объектами, используя Redis в качестве базы данных в Spring Boot 2.0? - PullRequest
0 голосов
/ 09 сентября 2018

У меня есть две сущности, а именно Пользователь и AuthenticationToken . Для каждого пользователя я генерирую токен JWT, который я хочу сохранить в кэше Redis для управления сеансом. Как мне это отобразить, должен ли я использовать user_id в качестве ключа и Token Object в качестве значения? У меня также будет несколько токенов (максимум 2) для одного пользователя, одного для Интернета и одного для мобильного, поэтому сохранение user_id в качестве ключа не является хорошим решением. Как правильно отобразить это в Redis?

1 Ответ

0 голосов
/ 09 сентября 2018

По вашему требованию вы можете использовать комбинацию user_id и типа токена в качестве ключа и указать AuthenticationToken объект в качестве значения.

Для генерации ключа вы можете добавить user_id и тип токена, как показано ниже:

user_id ==> 10
token_type ==> web / mobile

Итак, ключ будет 10_web / 10_mobile .

Я не очень понимаю, что вы имеете в объекте AuthenticationToken. Если вам нужна какая-либо вещь, связанная с сущностью User, вы можете добавить эту деталь в объект AuthenticationToken при сохранении в Redis, прикрепив свойство или весь объект User как свойство с аннотацией @Transient (если у вас нет сущности User связан с объектом AuthenticationToken)

Обновлено: Я добавляю пример отношения сущностей для User и AuthenticationToken, это может помочь вам понять, что я пытаюсь сказать.

Пользовательский объект

import javax.persistence.*;
import java.io.Serializable;

@Entity(name = "user")
public class User implements Serializable {

    @Id
    @GeneratedValue
    private Long userID;

    //Getters, Setters and other properties
}

Тип токена Enum (для разграничения между веб-токеном и мобильным токеном)

public enum TokenType {
    MOBILE, WEB
}

AuthenticationToken Entity

1. Если вы также хотите сохранить ссылку User и AuthenticationToken в базе данных, вы можете использовать следующую сущность:

import javax.persistence.*;
import java.io.Serializable;

@Entity(name = "authenticationtoken")
public class AuthenticationToken implements Serializable {

    @Id
    @GeneratedValue
    private Long id;

    @Column(unique = true)
    private String jwtToken;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "user", referencedColumnName = "userID")
    private User user;

    @Column
    @Enumerated(EnumType.STRING)
    private TokenType tokenType;

    // Getters, Setters and other properties

}

2. Если вы не хотите хранить ссылку User и AuthenticationToken в базе данных и предпочитаете, чтобы данные были указаны в токене JWT, то вы можете использовать ниже сущности:

import javax.persistence.*;
import java.io.Serializable;

@Entity(name = "authenticationtoken")
public class AuthenticationToken implements Serializable {

    @Id
    @GeneratedValue
    private Long id;

    @Column(unique = true)
    private String jwtToken;

    @Transient
    private User user;

    @Column
    @Enumerated(EnumType.STRING)
    private TokenType tokenType;

    // Getters, Setters and other properties

}

Таким образом, если вы хотите сохранить максимум 2 токена (один для веб-сайта и один для мобильного) для пользователя, вы можете получить данные по типу пользователя и токена в Redis / Database перед созданием нового токена, а также во время проверки.

Надеюсь, это поможет вам:)

...