如何在Spring Boot 2.0中使用Redis作为数据库映射两个实体之间的关系?

问题描述 投票:1回答:1

我有两个实体,即User和AuthenticationToken。对于每个用户,我生成一个JWT令牌,我想将其存储在Redis缓存中以进行会话管理。如何映射,我应该将user_id用作密钥并将Token Object用作值?我还将为一个用户提供多个令牌(最多2个),一个用于Web,一个用于移动,因此将user_id保留为密钥并不是一个好的解决方案。在Redis中映射这个的正确方法是什么?

spring-boot redis spring-data-redis
1个回答
0
投票

我觉得,根据您的要求,您可以使用user_id和令牌类型的组合作为键,并将AuthenticationToken对象作为值。

要生成密钥,您可以附加user_id和令牌类型,如下所示:

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

所以关键是10_web / 10_mobile。

我对AuthenticationToken对象中没有太多了解。如果您需要与User实体相关的任何内容,您可以在保存在Redis中的同时在AuthenticationToken对象中添加该详细信息,方法是将属性或整个User对象作为属性与annotaion @Transient相关联(如果您没有将User实体链接到AuthenticationToken对象) )

更新:我正在为UserAuthenticationToken添加一个示例实体关系,它可以帮助您理解我想说的内容。

用户实体

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
}

令牌类型枚举(用于区分Web /移动令牌)

public enum TokenType {
    MOBILE, WEB
}

AuthenticationToken实体

1.如果你想在数据库中存储UserAuthenticationToken的链接,那么你可以使用下面的实体:

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.如果您不想将UserAuthenticationToken的链接存储在数据库中并且希望在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个令牌(一个用于Web,一个用于移动),则可以在生成新令牌之前以及在验证时按用户和令牌类型在Redis /数据库中获取。

希望它能帮到你:)

© www.soinside.com 2019 - 2024. All rights reserved.