代码之家  ›  专栏  ›  技术社区  ›  Ritesh Kumar

Key斗篷会话超时,并使用扩展tomcat适配器阀Key斗篷AuthenticatorValve的用户详细信息记录超时事件

  •  0
  • Ritesh Kumar  · 技术社区  · 3 年前

    我有钥匙斗篷<->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中捕获它,然后从那里调用后端服务。

    0 回复  |  直到 3 年前