У меня есть два объекта, а именно User и AuthenticationToken. Для каждого пользователя я создаю токен JWT, который я хочу сохранить в кеше Redis для управления сеансом. Как мне это сопоставить, должен ли я использовать user_id в качестве ключа и Token Object в качестве значения? У меня также будет несколько токенов (максимум 2) для одного пользователя, один для Интернета и один для мобильных устройств, поэтому сохранение user_id в качестве ключа не является хорошим решением. Как правильно отобразить это в Redis?
Как сопоставить отношения между двумя объектами, используя Redis в качестве базы данных в Spring Boot 2.0?
Ответы (1)
Я чувствую, что в соответствии с вашим требованием вы можете использовать комбинацию user_id и типа токена в качестве ключа и поместить объект AuthenticationToken в качестве значения.
Чтобы сгенерировать ключ, вы можете добавить user_id и тип токена, как показано ниже:
user_id ==> 10
token_type ==> Интернет/мобильный
Таким образом, ключ будет 10_web/10_mobile.
Я не очень понимаю, что у вас есть в объекте AuthenticationToken. Если вам нужна какая-либо вещь, связанная с сущностью пользователя, вы можете добавить эту деталь в объект AuthenticationToken при сохранении в Redis
, присоединив к нему свойство или весь объект пользователя как свойство с аннотацией @Transient
(если у вас нет сущности пользователя, связанной с объектом 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
}
Перечисление типа токена (чтобы различать веб-токен и мобильный токен)
public enum TokenType {
MOBILE, WEB
}
Сущность AuthenticationToken
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/базе данных перед созданием нового токена, а также во время проверки.
Надеюсь, это поможет вам :)