我正在开发一个网站.

前端(SPA/vue.js)<->REST后端(Spring Boot 3.2.1,Java 21)

我为授权服务器 Select 了密钥罩IDP,这样就不会从头开始编写注册和授权的定制实现.这是我第一次使用 keys 斗篷.

我使用了spring-addons软件,并根据实例实现了BFF的设计.

前端<->Spring Gateway(客户端ouath2)<->Spring REST后端(OAuth2资源服务器)

我面临着一个问题,我不知道如何将用户从键盘斗篷绑定到我的Hibernate 实体.

简单的例子:

@Entity(name = "post")
public class Post {
    
    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Access(AccessType.PROPERTY)
    private Integer id;

    // another fields

    @Column(name = "content")
    private String content;

    @Column(name = "author_id", insertable = false, updatable = false)
    private Integer authorId; // how to ??? Keycloak user id is GUID...

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "user_id", referencedColumnName = "id")
    private KeycloakUser author; // how to ??? KeycloakUser - example

    // constructors / getters / setters omitted

}

问题是我如何将它们的作者分配给我的实体,以便稍后使用JPA可以根据请求提取它们,例如findById

Ifound a solution因为我需要维护我的应用程序的用户的单独数据库,有两个实现选项:

  1. 过滤器,其判断当前授权用户的存在,如果他没有在应用数据库中注册,则注册他;

  2. SPI是一个事件系统,可用于拦截新的用户注册事件并将其添加到应用程序的用户数据库中.

到目前为止,这两种 Select 在我个人看来都是可疑的,如果可能的话,我想了解一下解决这种问题的最佳实践,并举例说明.

推荐答案

答案是"你可能不应该这样做".

也许,您应该考虑在多服务体系 struct 中,OAuth2授权服务器(在您的 case 中是Keyshaak)是负责用户数据的服务.其他服务在Keyloak中为用户存储的标识符不超过immutable(sub声称是一个自然的候选,但如果它不会随着时间的推移而改变,你也可以使用preferred_username).

需要超过此ID的服务将在访问当前用户数据时读取访问令牌声明,或者使用Keyloak的"admin"API来获取任何其他用户的当前值.

如果复制用户数据,则不可避免地会遇到同步问题和不一致.

你可以浏览this project个我做的地方就像这样

Java相关问答推荐

Spring Webocket:尽管凭据设置为False,但MLhttpsify和Fetch请求之间的CORS行为存在差异

是否有一种格式模式,可以在除0之外的数字前面有正负符号?

Javascript更新alert 可扩展内容样式与CSS—按钮更多/更少

如何转换Tue Feb 27 2024 16:35:30 GMT +0800 String至ZonedDateTime类型""

如果一个子类没有构造函数,超类也没有构造函数,那么为什么我可以构造子类的实例呢?

基本时态运算的ISO-8601周数据表示法

为什么我的ArrayList索引的索引总是返回-1?

我不能再在Android Studio Hedgehog上用Java语言创建新项目了吗?

无法了解Java线程所消耗的时间

Bean定义不是从Spring ApplationConext.xml文件加载的

Spring Security不允许加载js

WebSockets和Spring Boot安全性出现错误401

如何在不删除Java中已有内容的情况下覆盖文件内容?

为什么在下面的Java泛型方法中没有类型限制?

FETCH类型设置为LAZY,但它仍会发送第二个请求

Java中HashSet的搜索时间与TreeSet的搜索时间

使用迭代器遍历HashMap不会因IF条件而停止

在打开搜索结果时,如何让Eclipse打开整个文件?

基于Java中mm/dd/yy格式的最近日期对数组列表进行排序

如何在Java中的重写方法参数中强制(Enum)接口实现?