2010-06-06 3 views
1

SEAM 보안 (http://docs.jboss.org/seam/2.1.1.GA/reference/en-US/html/security.html)을 사용하는 SEAM으로 작성된 기존 응용 프로그램이 있습니다.서블릿에서 Seam 보안을 사용하여 SLSB 호출

@In 
Identity identity; 

... 

if(identity.hasRole("admin")) 
    throw new AuthException(); 
지금까지 내가 이해

는, Seam이 때문에, EJB를 호출하는 서블릿의 SessionContext (이것은 "무대 뒤에서"일에서 신원 객체를 주입 : 무 상태 EJB, 나는 이런 식으로 뭔가를 찾을 수 있습니다 Seam은 실제로 서블릿을 사용하지 않는다.) 호출 후에 그것을 제거한다. 이 올바른지?

다른 서블릿에서이 EJB에 액세스 할 수 있습니까 (이 경우 서블릿은 GWT 애플리케이션의 서버 측입니까?). 올바른 Identity 인스턴스를 "주입"해야합니까? 아무것도하지 않으면 Seam이 인스턴스를 삽입하지만 세션과 Identity 인스턴스를 올바르게 연관 지을 수 없습니다. 따라서 Identity 인스턴스는 세션간에 공유되고 때로는 호출이 새로운 인스턴스 등을 가져옵니다.

도움과 조언을 매우 환영합니다 - 감사합니다!

기술 : EJB3, Seam 2.1.2. 서블릿은 사실 GWT 앱의 서버 측이지만, 이것이별로 중요하지 않다고 생각합니다. JBoss 5를 사용하고 있습니다.

답변

0

귀하의 질문은 믿을 수 없을 정도로 어렵고 모든 것을 이해하지 못했습니다. 어쨌든, 스테이트리스 세션 빈을 사용하고 있다고 가정합니다 (상태 유지빈을 사용할 수 있다고 말했기 때문에). 그렇다면 무 상태 세션 빈을 호출 한 후 Mary가 Joe로 인증받을 수 있습니까? 이럴 수는 없지만 아무 의미가 없습니다.

추신 : 질문을 다시 말하고 HTTP 세션, 세션 빈 (상태 비 저장, 상태 저장), SessionContext과 같은 개념을 명확하게 구분해야합니다.

+0

Hello Pascal, thx - 질문을 단순화하려고 시도했습니다. 예, SLSB가 사용되었습니다 (첫 번째 문장에서 암시 되었음). 세션 컨텍스트에서 상태가 Seam에 의해 관리되고 호출 될 때 SLSB를 주입 및 유출 된 것 같습니다. 잘못된? 어떤 개념을 오용 한 적이 있다면 : – wilth

2

Seam은 EJB를 호출하는 서블릿의 SessionContext에서 Identity 객체를 삽입하고 호출 후에 제거합니다. 이 올바른지 ?

네,하지만 당신은 EJB 심 인터셉터가 here를 참조하도록 설정해야합니다 잊지 어떻게

...

또 다른 서블릿에서 모든 EJB에 액세스 할 수있게되었습니다에

예, 전역 JNDI (공급 업체 종속)를 사용하여 검색 할 수 있습니다. EJB @State less/ful 빈을 설정하고 검색하는 방법은 here을 참조하십시오. - 지원되는 Java EE 애플리케이션 서버가있는 경우 특수 효과를 통해 검색 할 수 있습니다.

정확한 Identity 인스턴스를 "주입"해야합니까?

걱정할 필요가 없습니다. Seam EJB 인터셉터 그것을 처리한다. 어서.

UPDATE는

하지만 EJB의 정체성 개의 상이한 인스턴스가 주입된다. Seam이 사용하는 세션 컨텍스트가 서블릿의 세션 컨텍스트에 올바르게 연결되어 있지 않다고 생각합니까? 어떤 아이디어?

글쎄, 신원 구성 요소 자체는 equals 메서드를 구현하지 않습니다.이 메서드는 기본적으로 equals 비교 (==)를 사용하여 default equals 구현을 사용합니다. 각 EJB 호출마다 항상 새로운 Identity 구성 요소가 있는지 여부를 알 수 없습니다. (아마도 "두 개의 다른 인스턴스"가있는 이유를 설명 할 수 있습니다)

서블릿의 이 동일한 컨텍스트을 사용하는 경우 IdentityFilter를 isUserInRole 메서드를 사용하여 ID 할당 역할을 래핑하는 방법.

Servlet Security와 Seam identity 구성 요소 간의 통합을 제공하는 필터. 이 통합은 보안 관련 호출을 Seam identity 구성 요소에 위임하는 HttpServletRequestWrapper 구현 으로 HttpServletRequest를 래핑하여 수행됩니다.

은 사용 사용 @Identity 구성 요소 경우 기본적

그래서 그 대신 투입의 당신의 EJB (그리고 @Identity-에서 jected의 @)으로 사용하고

identity.hasRole("admin"); 

사용됩니다, 사용 가능

request.hasUserInRole("admin"); 

그리고 아마도 Setting and reading the Conversation ID과을보고 싶을 것입니다.

(안 기본적으로 활성화) ContextFilter 심 컨테이너와 같은 스트럿츠, 스프링 MVC 및 Direct Web Remoting (DWR)과 같은 비 JSF 서블릿에 컨텍스트 변수에 대한 액세스를 엽니 다. 이런 종류의 기능을 어떻게 사용하는지 모르겠습니다.

+0

답장을 위해 thx - EJB Seam Interceptor가 구성되었고 인스턴스를 검색하기 위해 JNDI를 사용하고 있습니다. 지금까지 작동하지만 문제가 있습니다. 예 : 로그인 (호출은 서블릿, EJB, Identity 인스턴스가 주입되어 인증에 사용됨). 그런 다음 사용자는 두 개의 서비스를 빠르게 연속적으로 호출합니다. 서블릿에서 두 호출은 SessionID를 사용하여 확인한 동일한 세션에서 끝나지 만 EJB에서는 Identity의 두 인스턴스가 삽입됩니다. Seam이 사용하는 세션 컨텍스트가 서블릿의 세션 컨텍스트에 올바르게 연결되어 있지 않다고 생각합니까? 어떤 아이디어? – wilth

+0

@wilth ** 업데이트 ** 참조 –

관련 문제