Keycloak将新注册的用户保存到应用程序数据库中



在我的应用程序中,我有一些实体关系,如用户和组织。我认为我会使用Keycloak,这样我就不必实现自定义注册、登录、密码重置、授权和身份验证。问题是,当用户注册到Keycloak时,我在应用程序的内部数据库中没有新的user实体。是否有任何方法自动创建新的用户实体在我的内部数据库在他的注册整个Keycloak?

我想在我的应用程序中自定义安全过滤器,看起来像这样:

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.keycloak.KeycloakSecurityContext;
import org.springframework.web.filter.GenericFilterBean;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;
import java.util.Optional;
import java.util.UUID;
public class UserRegistrationFilter extends GenericFilterBean {
private static final Logger console = LogManager.getLogger(UserRegistrationFilter.class);
private final UserRepository userRepo;
public UserRegistrationFilter(UserRepository userRepository) {
this.userRepo = userRepository;
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
KeycloakSecurityContext ctx = (KeycloakSecurityContext) servletRequest.getAttribute(KeycloakSecurityContext.class.getName());
console.warn("executed");
if (ctx != null) {
console.warn(ctx.getToken().getSubject());
Optional<User> existing = userRepo.findById(UUID.fromString(ctx.getToken().getSubject()));
if (existing.isEmpty()) {
User user = new User();
user.setUuid(UUID.fromString(ctx.getToken().getSubject()));
userRepo.save(user);
}
}
}
}

但这似乎是个坏主意。

谢谢你的建议。

我看不出你的方法有什么问题,我可能也会做类似的事情。

好吧,可能我会在整个应用中做的是检索用户不是直接从UserRepository而是从一个使用UserRepository的UserService。在UserService中,我将有一个findById方法,该方法将在内部请求repo查找用户,如果它不存在,则创建它并返回它。这样的话,我就不需要过滤器了,反正我也不觉得有那么糟糕。

我能想到的另一种选择,是通过webhooks侦听keycloak事件:

  • https://github.com/zonaut/keycloak-extensions/blob/master/spi-event-listener/README.md
  • https://github.com/jessylenne/keycloak-event-listener-http

因此keycloak通知您任何更改,例如用户创建。通过这种方式,你可以直接在keycloak中创建用户,即使他们从未登录过你的应用,你仍然可以在你的应用中注册他们。

PS:我从来没有尝试过keycloak事件,所以不能帮助细节

最新更新