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

llew8vvj  于 2021-07-23  发布在  Java
关注(0)|答案(1)|浏览(269)

在我的应用程序中,我有一些实体关系,如用户和组织。我想我会使用key斗篷,这样我就不必实现自定义注册、登录、密码重置、授权和身份验证。问题是,当用户注册到keydove时,我的应用程序的内部数据库中没有新的用户实体。有没有办法在我的内部数据库中自动创建一个新的用户实体在整个keydrope注册后?
我在我的应用程序中想到了自定义安全过滤器,它看起来像:

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);
            }
        }
    }
}

但这似乎是个坏主意。
谢谢你的建议。

mwg9r5ms

mwg9r5ms1#

我认为你的方法没有问题,我可能会做类似的事情。
在整个应用程序中,我要做的可能不是直接从userrepository中检索用户,而是从使用userrepository的userservice中检索用户。在userservice中,我会有一个findbyid方法,它会在内部请求repo找到该用户,如果该用户不存在,则创建并返回它。这样,我就不需要过滤器了,反正我觉得没那么糟。
我能想到的另一种方法是,通过webhooks收听key斗篷事件:
https://github.com/zonaut/keycloak-extensions/blob/master/spi-event-listener/readme.md
https://github.com/jessylenne/keycloak-event-listener-http
所以key斗篷会通知您任何更改,例如用户创建。通过这种方式,你可以直接在key斗篷中创建用户,即使他们从未登录过你的应用程序,你仍然可以在你的应用程序中注册他们。
ps:我从来没有尝试过keydape事件,所以无法帮助了解细节

相关问题