我有钥匙斗篷<->Tomcat<->后端服务。我使用的是Key斗篷Tomcat阀门。如果Key斗篷超时,我需要将用户详细信息发送到后端服务。我正在扩展Key斗篷AuthenticatorValve以捕获如果会话在Key斗篷中无效,身份验证将失败。但根据下面的代码,RefreshableKeycapeSecurityContext正在变为null,因此我无法检索用户信息来调用后端服务来注册超时事件。我试图扩展OAuthRequestAuthenticator::authenticate()方法,但此时无法检索用户信息,因为会话已经超时。有人能建议我如何在Key斗篷中的会话超时时在Tomcat中获取用户详细信息,并将用户信息发送到后端吗?提前谢谢。
公共类FMSKeycaptureAuthenticatorValve扩展了KeycaptureAuthenticator Valve{
@Override
public void invoke(Request request, Response response) throws IOException, ServletException {
super.invoke(request, response);
final RefreshableKeycloakSecurityContext secReqContext =
(RefreshableKeycloakSecurityContext) request.getAttribute(KeycloakSecurityContext.class.getName());
if (secReqContext != null) {
// Check if the token is active or expired
if (!secReqContext.isActive()) {
// Custom handling for expired token
handleExpiredToken(request, response, secReqContext);
return;
}
}
getNext().invoke(request, response);
}
private void handleExpiredToken(Request request, Response response,
KeycloakSecurityContext secReqContext) throws IOException {
StringBuilder stbUser = new StringBuilder(100);
stbUser.append(secReqContext.getToken().getPreferredUsername()).append("@")
.append(secReqContext.getRealm());
AuthenticationServiceRemote authService = ServiceLocatorBackend.getInstance()
.getService(stbUser.toString(), AuthenticationServiceRemote.class);
try {
authService.logout(true, stbUser.toString(), request.getRemoteAddr());
} catch (Exception e) {
log.error("Error occurred while calling the logout service", e);
}
}
}
我得到的secReqContext为null,但我想捕获Keycapture中有timedout的用户,并在tomcat valve中捕获它,然后从那里调用后端服务。