2012-05-17 1 views
3

웹 응용 프로그램과 다른 JBoss 인스턴스 모두에서 JBoss 7.1 서버의 EJB에 원격 액세스를 제공하기 위해 jboss remoting 2.5.4.SP3을 사용하고 있습니다. JBoss 7.1의 원격 EJB 액세스 문제로 인해 여러 서버에서 동시에 동일한 (인터페이스) Bean에 액세스 할 수 없기 때문에 수동으로 수행하고 있습니다. remoting3에는 설명서가 없으므로 remoting2를 사용하고 있습니다.보안 컨텍스트 정보를 수동으로 설정/전파하는 방법. JBoss 7의 교장 (JBoss 리모팅 2 이상)

소켓 전송을 사용하여 TransporterHandle/TransporterClient를 사용하여 원격 작업을 수행하지만이 원격 연결을 통해 호출 된 메서드에서 서버는 ejbContext에서 보안 주체를 조회하려고합니다. 주체 또는 기타 상황 별 보안/ID 정보를 수동으로 설정하는 방법을 찾을 수 없습니다. 제한에서 ejb 메소드가 호출 될 때 principal을 설정하는 것만으로도 행복 할 것입니다. 모든 들어오는 호출은 로컬 EJB3 Bean에 대한 것이거나 EJBContext를 위해 특별히 설정하는 것입니다.

나는 스프링에 관한 많은 정보를 발견했다. (나는 사용하지 않고있다.) 그러나 아무 것도 나의 특별한 맥락과 일치하지 않는다.

답변

1

그리고 지금,이 할 수있는 올바른 방법 : 나는 보안 컨텍스트를 얻고 호출과 함께 서버로 전송을위한 보안 영역 및 대상 정보를 패키징 클라이언트 측에서

합니다. SecurityDomain은 문자열이며 SubjectInfo는 직렬화 가능합니다.

Map m = new HashMap(); 
SecurityContext securityContext = SecurityContextAssociation.getSecurityContext(); 
if (securityContext != null) { 
    m.put("SUBJECT-INFO", securityContext.getSubjectInfo()); 
    m.put("SECURITY-DOMAIN", securityContext.getSecurityDomain()); 
} 
response = remotingClient.invoke(request, m); 

지도 m은 jboss remoting을 통해 호출과 함께 전송됩니다. 서버 측에서는 보안 정보를 추출하고 다음과 같이 호출 컨텍스트를 설정합니다.

SecurityContext oldContext = SecurityContextAssociation.getSecurityContext(); 
SubjectInfo si = (SubjectInfo) invocation.getRequestPayload().get("SUBJECT-INFO"); 
String domain = (String) invocation.getRequestPayload().get("SECURITY-DOMAIN"); 
if (si != null) { 
    SecurityContext sc = new JBossSecurityContext(domain); 
    sc.setSubjectInfo(si); 
    SecurityContextAssociation.setSecurityContext(sc); 
} 
try { 
    return super.invoke(invocation); 
} finally { 
    SecurityContextAssociation.setSecurityContext(oldContext); 
} 

매력처럼 작동합니다.

+0

JBoss 전용 솔루션을 이용해 주셔서 감사합니다. 나는 비 컨테이너 특정 방식으로 해결하려고 노력하고 동일한 필요가있다 : http://stackoverflow.com/questions/12213734/how-to-propagate-jaas-subject-when-calling-a-remote-ejb- rmi-over-iiop-from-ap –

0

jboss-ejb-client.properties을 살펴보십시오. quickstart 예제에서 원격 클라이언트를 사용하여 EJB를 조회합니다.

+1

나는이 모든 것을 할 수있다. 내가 알아야 할 것은 서블릿이나 EJB 또는 다른 EE 구성 요소가 아닌 JBoss 7.1에서 보안 컨텍스트에 액세스하고 설정하는 방법입니다. 사용자가 서블릿을 통해 웹 요청을하고 인증했다고 가정 해 보겠습니다. 그런 다음 로그온 한 교장을 얻고 싶지만 정상적인 코드이므로 Session/EJBContext를 삽입 할 수 없습니다. 나는 소켓 연결을 통해 그것을 전달할 수 있도록 교장이 필요합니다.그런 다음 소켓 연결의 다른 쪽에서는 후속 EJBContext.getCurrentPrincipal 등이 소켓을 통해 들어온 주체를 반환하도록 주체를 설정해야합니다. –

+1

오해에 대해 사과드립니다. 나는 정말로 보안 전문가는 아니지만 제한된 비트로 AS 7이 보안 비트를 처리하기 위해 많은 콜백 핸들러를 사용한다는 것을 알고 있습니다. 이 링크 *는 https://community.jboss.org/wiki/SecurityFAQ에 도움이 될 수 있습니다. –

+0

예, 그 FAQ는 내가 찾고 있었지만 찾지 못했던 정보를 가지고 있습니다. 감사. –

0

내가 바라는 일반적인 방식은 아니지만 근본적인 문제를 해결했습니다.

들어오는 모든 요청에 ​​서블릿 필터를 적용하고 request.getUserPrincipal을 로컬 스레드에 기록합니다. 그러면 비 EE 코드에서이 정보에 액세스하고 요청을 작성한 교장을 찾을 수 있습니다. 그런 다음 응용 프로그램 서버에 전화를 걸면 각 호출에 메타 데이터를 첨부하여 주체를 전달하는 JBoss Remoting의 기능을 사용합니다. 개인 생성자 외에도 TransporterClient를 복사해야했기 때문에 요청 당 메타 데이터를 첨부하는 데 필요한 기능을 재정의 할 수 없었습니다 (연결마다). 서버 측에서 들어오는 주체를 가져 와서 로컬 스레드로 설정합니다. 그런 다음 EJBContext.getCallerPrincipal에 액세스하는 후속 코드에서 로컬 스레드에서 들어오는 Principal을 조회하고, 이것이 null이 아니면 (따라서 원격 EJB 호출에있다.) 호출자 보안 주체가 익명 인 경우이를 사용한다. 익명이 아닌 경우 들어오는 호출 후에 어떤 식 으로든 설정되어 있어야하므로이 경우 들어오는 사용자를 무시합니다.

모두 내가 원했던 것보다 훨씬 더 전문화 된 솔루션이었으며, JBoss 7.1에서 일반적인 컨텍스트 전파를 어떻게 수행 할 수 있는지에 대해 밝히지 않았습니다.