在我的应用程序中,我有一些实体关系,如用户和组织。我想我会使用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);
}
}
}
}
但这似乎是个坏主意。
谢谢你的建议。
1条答案
按热度按时间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事件,所以无法帮助了解细节