我有两个实体,即User和AuthenticationToken。对于每个用户,我生成一个JWT令牌,我想将其存储在Redis缓存中以进行会话管理。如何映射,我应该将user_id用作密钥并将Token Object用作值?我还将为一个用户提供多个令牌(最多2个),一个用于Web,一个用于移动,因此将user_id保留为密钥并不是一个好的解决方案。在Redis中映射这个的正确方法是什么?
我觉得,根据您的要求,您可以使用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对象) )
更新:我正在为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
}
令牌类型枚举(用于区分Web /移动令牌)
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个令牌(一个用于Web,一个用于移动),则可以在生成新令牌之前以及在验证时按用户和令牌类型在Redis /数据库中获取。
希望它能帮到你:)