2012-12-27 1 views
3

내장 된 GlassFish 컨테이너로 JUnit-4 테스트를 시도하는 @RolesAllowed protected @Stateless EJB가 있습니다. 극복 한 가장 최근의 장애물은 지속성 단위 및 보안 영역에 대한 GlassFish 도메인 구성입니다.GlassFish가 내장 된 @RolesAllowed 보안 EJB3.1을 테스트하는 방법

Map<String, Object> properties = new HashMap<String, Object>(); 
properties.put(EJBContainer.MODULES, new File("build/classes")); 
properties.put("org.glassfish.ejb.embedded.glassfish.configuration.file", 
    "test-resource/domain.xml"); 
ec = javax.ejb.embeddable.EJBContainer.createEJBContainer(properties); 

임베디드 글래스 피쉬는 내 응용 프로그램 배포, 시작하고, 모든 것을 내가 @RolesAllowed 주석과 EJB 메소드를 호출 할 때까지 예상대로 작동하는 것 같다.

javax.ejb.AccessLocalException: Client not authorized for this invocation 

보안 검사를 통과하기 위해 컨테이너 역할을 설정하는 방법을 알 수 없습니다. 내가 뭘 놓치고 있니?

답변

5

com.sun.appserv.security.ProgrammaticLogin 클래스를 사용하면 도움이됩니다. 이는 Java EE 6 API가 아닌 GlassFish에만 해당됩니다. 다른 임베디드 컨테이너를 사용하는 경우 동일한 컨테이너를 찾아야합니다.

를 사용하면 사용자로 로그인하고 현재 스레드에 대한 보안 주체를 설정할 수 있습니다. 그것의 사용의 예는 다음과 같습니다 userpassword가 자격 증명

ProgrammaticLogin login = new ProgrammaticLogin(); 
login.login("user", "password", "file", true); 

file 영역에서 사용자로 로그인하는 데 사용할 수 있습니다. 이를 통해 임베디드 컨테이너에 배포 된 EJB를 호출 할 때 사용할 보안 주체를 설정할 수 있습니다. 이것이 없으면 익명의 주체가 주체로 사용됩니다 (따라서 컨테이너가 RolesAllowed 제약 조건을 적용 할 때 예외가 발생합니다).

또한 기존 보안 영역을 사용해야 함을 유의하십시오. 응용 프로그램에서 사용하는 보안 영역이 미리 구성된 domain.xml 파일을 포함하는 사용자 지정 GlassFish 설치 루트 (또는 인스턴스 루트)를 사용하는 것이 좋습니다.

ProgrammaticLogin API를 사용하는 방법에 대한 자세한 내용은 this Oracle blog entry에서 확인할 수 있습니다.

+0

'glassfish/modules/security.jar'의 ProgrammaticLogin 영역이 올바르게 구성되었는지 확인하십시오. 필요한 경우 유용한 로깅'javax.enterprise.system.core.security.level = FINE' –