如何在我的应用程序中集成或使用KeyCloak用户数据库?

时间:2016-08-31 21:55:24

标签: hibernate jpa keycloak

到目前为止,我一直在玩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;
    }
}

1 个答案:

答案 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端,我需要访问它。