2013-10-09 3 views
8

Java EE 7 애플리케이션이 있으며 Arquillian을 사용하여 테스트합니다. 이제 우리는 현재 로그인 한 사용자의 권한을 확인하려고합니다. 내 질문은 아주 기본적인 것이다. 어떻게하면 테스트 케이스 안에있을 때 사용자를 로그인 할 수 있을까? ProgrammaticLogin doesnt work in arquillian testsEmbedded Glassfish, security and Arquillian questions을 읽었지만 명확하게 답변되지 않았습니다. 내가 이것을 실행하려고하면 Arquillian으로 로그인/인증을 테스트하는 방법 - Java EE 7

// Inject services etc. 

@Test 
public void testLogin(){ 

    UserAccount user = new UserAccount(); 
    user.setUsername("bob"); 
    user.setPassword("bob"); 
    userAccountService.save(user); 

    ProgrammaticLogin pl = new ProgrammaticLogin(); 
    String realmName = "secureJDBCRealm"; 
    try { 
     pl.login("bob", "bob".toCharArray(), realmName, true); 
    } catch (Exception e){ 
     e.printStackTrace(); 
    } 
} 

지금, A는 LoginException이 내가 "fileRealm"에 대해 구성된 로그인 모듈이 없다고 주장 얻을 : 내 현재의 접근 방식은 다음과 같이한다. 그러나 "fileRealm"은 내가 검색하고있는 영역이 아닙니다 (처음 테스트 할 때 넣었지만 GlassFish에 대한 사용자 정의 보안 영역 인 "secureJDBCRealm"으로 변경했습니다). 테스트에는 arquillian-glassfish-embedded-3.1을 사용합니다.

  • 누가 Arkillian의 영역을 정의해야 할 곳을 알고 있습니까?
  • 내 응용 프로그램이 fileRealm을 계속 찾고있는 이유는 무엇입니까? 이 값이 기본값입니까? (여기서 사양을 찾을 수 없음)

답변

3

Arquillian은 영역 정의에 대한 지원을 제공하지 않습니다. 대신 컨테이너에서 영역을 직접 구성해야합니다. Glassfish 컨테이너를 사용할 때 다소 까다 롭지 만 할 수 있습니다.

secureJDBCRealm은 표준/내장 Glassfish Realms 중 하나가 아닌 사용자 지정 영역이라고 가정합니다. 임베디드 글래스 피시 컨테이너의 사용자 정의 영역을 구성하려면 다음을 수행해야합니다

  1. 장소 영역을 참조하는 테스트 클래스 경로에 login.conf 파일을. 이렇게하려면 자원 디렉토리에 config 디렉토리를 추가하고 그 디렉토리 안에 login.conf을 넣으십시오. 귀하의 login.conf는 종속성이 테스트 클래스 경로에 있어야와 함께이

    secureJDBCRealm { 
        com.blah.blah.LoginModule required; 
    }; 
    
  2. 귀하의 사용자 정의 영역과 같을 것입니다.

  3. glassfish에서 영역을 프로그래밍 방식으로 만들어야합니다. 이것은 org.glassfish.embeddable.CommandRunner를 통해 수행 할 수 있습니다.

    @Resource(mappedName = "org.glassfish.embeddable.CommandRunner") CommandRunner commandRunner; 
    
    public void configureLoginRealm() { 
        CommandResult commandResult = commandRunner.run("create-auth-realm", "--classname=com.blah.blah.SecureJDBCRealm", "--property=jaas-context= secureJDBCRealm", "secure-JDBC-realm"); 
        log.debug(commandResult.getExitStatus().toString() + " " + commandResult.getOutput()); 
        Throwable throwable = commandResult.getFailureCause(); 
        if (throwable != null) { 
         log.error(throwable.getMessage(), throwable); 
        } 
    } 
    

    은}

  4. 그런 다음 프로그램

    ProgrammaticLogin pl = new ProgrammaticLogin(); 
    String realmName = "secureJDBCRealm"; 
    try { 
        pl.login("bob", "bob".toCharArray(), realmName, true); 
    } catch (Exception e){ 
        e.printStackTrace(); 
    } finally { 
        pl.logout(); 
    } 
    
+0

감사로 로그인 할 수 : 다행히 Arquillian 포함 된 컨테이너는 다음 작업을 수행 할 수 있음을 의미 JNDI를 통해이 가능하게! 그러나 이미 사전 구성된 올바른 영역으로 원격 GlassFish를 사용하게되었습니다. 원격 지원은 오래전에 나온 것이 아니기 때문에 처음에는이 가능성을 보지 못했습니다. – bmurauer

+1

CommanderRunner 인터페이스가 변경되었으며 더 이상 작동하지 않습니다. -/Glassfish 3.1.2.2 –