到目前为止,我一直在玩KeyCloak,并且能够成功设置并运行客户门户示例。现在我需要在我的应用程序中实际使用它,我不完全确定KeyCloak是否是我正在寻找的正确的东西,但我相信我的需要只是一个常见的用例,希望KeyCloak是我正确的软件寻找..
当用户访问我的网站时,他会注册并发帖。帖子和用户信息都存储在数据库中,以及用户和帖子之间的链接,即谁制作了哪些帖子?所以我的数据库中有两个表:Post(id,post)和User(id,name),另一个表UserPost(PostID,UserID)用于存储链接信息。这在我自己的数据库中都很好。
但现在当KeyCloak发挥作用时,用户首先在KeyCloak服务器中注册,用户信息存储在自己的数据库中,这似乎与我的应用程序中的数据库(Post和User)无关。我不想在两台服务器上复制两个用户数据库,对吗?即使我可以容忍重复,如何在KeyCloak数据库和我的应用程序数据库之间建立连接?我在我的应用程序中使用JBoss,Hibernate / JPA。
也许我错过了如何将KeyCloak用户表与我自己的应用程序数据库连接起来的方式。有没有我可以阅读的教程或文档?
谢谢。
更新:我的应用程序中的此用户表仅存储一个ID,该ID将来自KeyCloak用户注册信息,另外还有一个字段'信誉'将根据此用户的新帖子进行分配。用户的大多数其他属性将在KeyCloak的USER_ENTITY表中保持不变。现在,每当新用户注册时,KeyCloak都会将记录插入USER_ENTITY表。不用担心。但与此同时,我需要根据KeyCloak USER_ENTITY中的用户ID在我的应用程序中向User表添加记录。问题是如何从注册html页面获取Keycloak的用户ID?
@Entity
public class User {
@Id
private Long id;
private int reputation = 0;
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Post> posts = new ArrayList<>();
public User() {
}
public User(Long id, int reputation) {
this.id = id;
this.reputation = reputation;
}
public void setId(Long id) {
}
public Long getId() {
return id;
}
public void setReputation(int reputation) {
this.reputation = reputation;
}
public int getReputation() {
return reputation;
}
public List<Post> getPosts() {
return posts;
}
}
@Entity
public class Post {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne
private User user;
private String text;
public Post() {
}
public Long getId() {
return id;
}
public void setUser(User user) {
this.user = user;
}
public User getUser() {
return user;
}
public void setText(String text) {
this.text = text;
}
public String getText() {
return text;
}
}
答案 0 :(得分:2)
我正在进行转换,几乎就是这样。我在本土数据库中拥有用户和角色,并通过自定义UsernamePasswordLoginModule使用Wildfly安全性。我现在要搬到Keycloak。
我也为其他用户提供了数据库参照完整性。我所做的是不完全删除用户表,而是将所有用户属性移动到Keycloak。我维护一个用户表,其中包含非常少量的信息和主键,即Keycloak“用户名”(GUID)。你可以通过获得校长得到这个:
@Context
private SecurityContext sc;
...
String userId = sc.getUserPrincipal().getName();
现在我有了一个可以与JPA一起使用的密钥,可以让用户将它们绑定到需要绑定的任何内容上。
还有一个步骤,我从Keycloak获得更多关于用户的数据。现在我在AccessToken中已经足够了:
KeycloakPrincipal<KeycloakSecurityContext> kcPrincipal = (KeycloakPrincipal<KeycloakSecurityContext>)(sc.getUserPrincipal());
AccessToken accessToken = kcPrincipal.getKeycloakSecurityContext().getToken();
String firstName = accessToken.getGivenName();
String lastName = accessToken.getFamilyName();
但我最终会将自定义用户属性推送到Keycloak端,我需要访问它。