Как сопоставить отношения между двумя объектами, используя Redis в качестве базы данных в Spring Boot 2.0?

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


person Paras    schedule 09.09.2018    source источник


Ответы (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/базе данных перед созданием нового токена, а также во время проверки.

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

person ramkishorbajpai    schedule 09.09.2018