Nano Hash - криптовалюты, майнинг, программирование

Как получить сеанс по идентификатору сеанса в JBoss 5

Я хочу убедиться, что сеанс в JBoss 5 все еще активен и находится в состоянии входа в систему. для реализации JWT (веб-токен json).

для этого мне нужно получить сессию по id.


Ответы:


1

для отладки: JBoss использует специальную версию tomcat под названием JBoss web. затем я искал «jboss web 2 * jar» и добавил его в качестве источника для источников для затмения, после чего я мог его отладить. также в eclipse я установил декомпилятор FernFlower с торговой площадки eclipse (* я взял актуальную версию с https://developer.jboss.org/wiki/VersionOfTomcatInJBossAS)

Я сослался на эти источники как обновить файл cookie JSESSIONID после входа в систему https://github.com/auth0/java-jwt

мое решение может помочь другим серверным серверам псевдо tomcat

package com.mysoftware.controller.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTVerificationException;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.mysoftware.util.SqlInjectionAndXSSRequestWrapper;

import com.mysoftware.model.User;

import java.io.IOException;
import java.lang.reflect.Field;
import java.util.Arrays;

import javax.servlet.ServletRequest;
import javax.servlet.ServletRequestWrapper;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.catalina.Manager;
import org.apache.catalina.Session;
import org.apache.catalina.connector.Request;
import org.apache.catalina.connector.RequestFacade;
import org.jboss.seam.security.Identity;
import org.jboss.seam.web.ServletContexts;
import org.jboss.util.Base64;

import javax.crypto.spec.SecretKeySpec;
import javax.crypto.Cipher;

public class JWTAuthorization  {


    public static String isSessionIdLoggedIn(String requestedSessionId) {
        try {
            // get the request
            HttpServletRequest request =ServletContexts.instance().getRequest();
            ServletRequest serverletRequest = ((ServletRequestWrapper)request).getRequest();

            // first need to unwrap the request until the core - org.apache.catalina.connector.Request.
            // i had additional wrapper around the request SqlInjectionAndXSSRequestWrapper. (you probably wont have it)
            // for simplicity i added SqlInjectionAndXSSRequestWrapper.request to my class, just saved the constructor argument.

            SqlInjectionAndXSSRequestWrapper injectionRequest = (SqlInjectionAndXSSRequestWrapper) serverletRequest;
            // code may start here, I run it and cast it and debug it and when I see it crash: "can't convert class x to y'. I understand which class it is and unwrap it accordingly.

            RequestFacade requestFacade = (RequestFacade) injectionRequest.request;

            Field catalinaRequestField;
            //Getting actual catalina request using reflection
            catalinaRequestField = requestFacade.getClass().getDeclaredField( "request" );
            catalinaRequestField.setAccessible( true ); // grant access to (protected) field
            Request realRequest = (Request)catalinaRequestField.get( requestFacade );
            Manager manager = realRequest.getContext().getManager();

            HttpSession  session = null;
            try {
                session=(HttpSession) manager.findSession(requestedSessionId);
            } catch (IOException var7) {}
            if (session != null && !((Session) session).isValid()) {session = null;}

            if (session != null) {((Session) session).access();} // mark usage

            if (session != null && session.isNew()) return "new";
            if (session != null )
            {   
                Identity identity = (Identity)session.getAttribute("org.jboss.seam.security.identity");
                if (identity != null && identity.isLoggedIn()) return "login";
            }
            return "not login";
        } catch (Exception e1) {
            e1.printStackTrace();
            return "exception";
        }
    }


    protected final static String sessionidencryptionkey="1234567890ghdg";
    protected final static String jwtsecret="1234567890sdghsg";
    public static String getTokenForCRM(User user)
    {
        try {
            Algorithm algorithm = Algorithm.HMAC256(jwtsecret);
            String token = JWT.create()
                .withSubject(user.getId().toString())
                .withArrayClaim("CRM", new String[]{ user.getAccount().getCrm() } )
                .withClaim("SessionID", encrypt( ServletContexts.instance().getRequest().getSession().getId() , sessionidencryptionkey)   )
                .sign(algorithm);
            return token;
        } catch (Exception exception){
            //Invalid Signing configuration / Couldn't convert Claims.
        }
        return "ERROR_CREATEING_TOKEN";
    }

    public static String getSessionId(DecodedJWT token)
    {
        try {
            return decrypt( token.getClaim("SessionID").asString() , sessionidencryptionkey) ;
        } catch (Exception e) {
            //e.printStackTrace();
            return null;
        }
    }

    public static DecodedJWT verifyToken(String token)
    {
        try {
            Algorithm algorithm = Algorithm.HMAC256(jwtsecret);
            JWTVerifier verifier = JWT.require(algorithm)
                //.withIssuer("auth0")
                .build(); //Reusable verifier instance
            DecodedJWT jwt = verifier.verify(token);

            return jwt;
        } catch (JWTVerificationException exception){
            //Invalid signature/claims
        }
        return null;
    }

    public static String encrypt(String strClearText,String strKey) throws Exception{
        String strData="";

        try {
            SecretKeySpec skeyspec=new SecretKeySpec(strKey.getBytes(),"Blowfish");
            Cipher cipher=Cipher.getInstance("Blowfish");
            cipher.init(Cipher.ENCRYPT_MODE, skeyspec);
            byte[] encrypted=cipher.doFinal(strClearText.getBytes());
            strData=new String(encrypted);
            //strData=Base64.encodeBytes(encrypted);


        } catch (Exception e) {
            e.printStackTrace();
            throw new Exception(e);
        }

        return strData;
    }

    public static String decrypt(String strEncrypted,String strKey) throws Exception{
        String strData="";

        try {
            SecretKeySpec skeyspec=new SecretKeySpec(strKey.getBytes(),"Blowfish");
            Cipher cipher=Cipher.getInstance("Blowfish");
            cipher.init(Cipher.DECRYPT_MODE, skeyspec);
            final byte[] strEncryptedBytes=strEncrypted.getBytes();
            // final byte[] strEncryptedBytes==Base64.encode(strEncrypted)
            byte[] decrypted=cipher.doFinal(strEncryptedBytes);
            strData=new String(decrypted);

        } catch (Exception e) {
            e.printStackTrace();
            throw new Exception(e);
        }
        return strData;
    }

}

мой тестовый код был.

внутри контроллера у меня было:

вызовите его без wuery в разных браузерах, затем добавьте параметр другого идентификатора сеанса в одном из браузеров

@GET
@Path("testJWTSessionCheck")
@Produces("application/json")
public String testJWTSessionCheck( @QueryParam("s") String requestedSessionId) {

    if(requestedSessionId!=null && requestedSessionId.length()>5) {
        JWTAuthorization.isSessionIdLoggedIn(requestedSessionId);
    }

    HttpSession session1 = ServletContexts.instance().getRequest().getSession(false);
    return session1.getId();
}
23.04.2019
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..