2012-07-08 2 views
4

내 환경은 Jboss AS 7.1.0입니다. 유닛 테스트를 위해 JUnit과 Arquillian을 사용하고 있습니다. 나는 내 ejbs에서 getUserPrincipal() 및 isCallerInRole() 메서드를 사용하는 SSB를 사용합니다. 이러한 ejb 메소드를 단위 테스트하려면, 유닛 테스트 케이스에서 로그인을 시뮬레이트 한 다음 ejb를 호출해야합니다.엔터프라이즈 빈에서 getUserPrincipal() 및 isCallerInRole() 메소드를 사용할 때 JUnit 테스트를 작성하는 방법은 무엇입니까?

@RolesAllowed({"user","admin"}) 
public User getMyUserDetails() throws BadInputDataException { 
    String userName = ctx.getCallerPrincipal().getName(); 
    return findUser(userName); 
} 

가 어떻게이 방법을 테스트하는 JUnit 테스트 케이스를 작성하려면 어떻게해야합니까 : 여기

내가 시험에 노력하고 EJB 방법의 예입니다? 도움을 주셔서 감사합니다. 내가 조직을 사용하려면 아래 테어의 솔루션에 표시된 JBossLoginConfigFactory을 변경

<security-domains> 
    <security-domain name="other" cache-type="default"> 
     <authentication> 
      <login-module code="Remoting" flag="optional"> 
       <module-option name="password-stacking" value="useFirstPass"/> 
      </login-module> 
      <login-module code="Database" flag="required"> 
       <module-option name="dsJndiName" value="java:jboss/datasources/MysqlDS"/> 
       <module-option name="principalsQuery" value="select Password from Principals where PrincipalID=?"/> 
       <module-option name="rolesQuery" value="select Role, RoleGroup from Roles where PrincipalID=?"/> 
       <module-option name="password-stacking" value="useFirstPass"/> 
       <module-option name="hashAlgorithm" value="MD5"/> 
       <module-option name="hashEncoding" value="RFC2617"/> 
       <module-option name="hashUserPassword" value="false"/> 
       <module-option name="hashStorePassword" value="true"/> 
       <module-option name="passwordIsA1Hash" value="true"/> 
       <module-option name="storeDigestCallback" value="org.jboss.security.auth.callback.RFC2617Digest"/> 
      </login-module> 
     </authentication> 
    </security-domain> 

: 7월 19일에

업데이트가 (아래 테어의 솔루션을 기반으로) : 아래로

내 보안 도메인 구성은 .jboss.security.auth.spi.DatabaseServerLoginModule.

DatabaseServerLoginModule에 대해 다음 메소드를 사용하도록 JBossLoginConfigFactory를 변경했습니다.

private AppConfigurationEntry createDatabaseModuleConfigEntry() { 
    Map<String, String> options = new HashMap<String, String>(); 
    options.put("dsJndiName", "java:jboss/datasources/MysqlDS"); 
    options.put("hashAlgorithm", "MD5"); 
    options.put("hashEncoding", "RFC2617"); 
    options.put("hashUserPassword", "false"); 
    options.put("hashStorePassword", "true"); 
    options.put("passwordIsA1Hash", "true"); 
    options.put("storeDigestCallback", "org.jboss.security.auth.callback.RFC2617Digest"); 
    options.put("principalsQuery", "select Password from Principals where PrincipalID=?"); 
    options.put("rolesQuery", "select Role, RoleGroup from Roles where PrincipalID=?"); 

    return new AppConfigurationEntry("org.jboss.security.auth.spi.DatabaseServerLoginModule", 
       AppConfigurationEntry.LoginModuleControlFlag.REQUIRED, options); 
} 

및 createUsersRolesLoginModuleConfigEntry() 대신이 메서드를 호출합니다. 이제 테스트 케이스의 loginContext.login()이 다음과 같이 실패합니다.

Caused by: java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: org.jboss.security.auth.callback.MapCallback 

내가 지금 바꿔야할지 확실하지 않습니다!

업데이트 07/20/2012 : 문제의 완전한 해결책은 아래에 있습니다. 솔루션에 DatabaseServerLoginModule이 필요하지 않은 경우 Tair의 응답에서 솔루션을 참조하기 만하면됩니다.

제 경우에는 JaaS 인증 및 소화 인증으로 데이터베이스가 있습니다. 따라서 위의 예에 다음 코드를 변경해야했습니다.

  1. I는 다음과 같이 코드 (JBossLoginContextFactory) "을 org.jboss.security.auth.spi.DatabaseServerLoginModule"을 지원하도록 수정 하였다. AppConfigurationEntry []를 만드는 동안 createUsersRolesLoginModuleConfigEntry() 대신이 메서드를 호출합니다.

    개인 AppConfigurationEntry createDatabaseModuleConfigEntry() { 지도 옵션 = 새 HashMap(); options.put ("dsJndiName", "java : jboss/datasources/MysqlDS"); options.put ("principalsQuery", "Principal의 암호 선택 위치 PrincipalID =?"); options.put ("rolesQuery", "역할 선택, RoleGroup from PrincipalID =?"); 새로운 AppConfigurationEntry ("org.jboss.security.auth.spi.DatabaseServerLoginModule", AppConfigurationEntry.LoginModuleControlFlag.REQUIRED, options)를 반환합니다. }

  2. 다이제스트 인증을 사용하기 때문에 암호가 데이터베이스에서 암호화됩니다. 그래서 내 테스트 케이스에서 패스워드를 전달하는 동안, 나는 아래와 같이 패스워드를 암호화하고 전달하고있다. LoginContext loginContext = JBossLoginContextFactory.createLoginContext ("username", md5Hex ("my_username"+ ":"+ PropertyManager.getProp ("realm") + ":"+ "my_password"));

이제 로그인이 성공했습니다!

+0

전체 스택 트레이스를 표시하십시오. – Tair

+0

'Map options'이 비어 있어야합니다. 이미' '에서 모든 옵션을 부여했습니다. – Tair

+0

해결책을 게시 해 주셔서 대단히 감사드립니다. 그것은 나를 많이 도왔다. – fabstab

답변

1

귀하의 사례는이 example에서 다룹니다. 당신이

  • 테스트를 EJB에 대한 참조를 얻기 위해 그 컨텍스트를 사용 Context.SECURITY_PRINCIPALContext.SECURITY_CREDENTIALS
  • 에 대한 사전 설정 값으로 컨텍스트를 구축하는

    1. 사용 arquillianContext : 기본적으로 그것은 아래로 비등.

    행운을 빌어 요!

    업데이트 : Arquillian에서 많이 변경된 것 같습니다. 다행히도 solution입니다. 나는 그것을 테스트하고 그것이 효과가 있는지 확인합니다!

  • +0

    안녕하세요 테어, 답장을 보내 주셔서 감사합니다. 나는 이것을 전에 시도했다. 하지만 ArquillianContext가 위의 예제에서 작동하지 않기 때문에 나는 여전히 멈추었습니다. 과거에 이것을 시도 했습니까? 그렇다면 ArquillianContext를 어디에서 얻을 수 있는지 알려주십시오. 아래 스레드를 참조하십시오 : https://community.jboss.org/message/748206#748206. 컨텍스트를 얻는 방법에 대한 다른 제안이 있지만 컨텍스트를 사용하는 방법에 대한 제안은 분명하지 않습니다. 도와 주셔서 감사합니다. –

    +0

    내 대답에 대한 업데이트를 참조하십시오 – Tair

    +0

    Thanks Tair. 이것은 유망 해 보입니다. JaaS 로그인을 위해 데이터베이스 로그인 모듈을 사용하고 있으며이 코드는 UserRolesLoginModule을 기다리고 있습니다. JBossLoginContextFactory에서 데이터베이스 로그인 모듈이 작동하도록 변경해야 할 사항을 파악하려고합니다. 여기서 내가 무엇을 바꿔야하는지 알겠습니까? –

    관련 문제