내 환경은 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 인증 및 소화 인증으로 데이터베이스가 있습니다. 따라서 위의 예에 다음 코드를 변경해야했습니다.
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)를 반환합니다. }
- 다이제스트 인증을 사용하기 때문에 암호가 데이터베이스에서 암호화됩니다. 그래서 내 테스트 케이스에서 패스워드를 전달하는 동안, 나는 아래와 같이 패스워드를 암호화하고 전달하고있다. LoginContext loginContext = JBossLoginContextFactory.createLoginContext ("username", md5Hex ("my_username"+ ":"+ PropertyManager.getProp ("realm") + ":"+ "my_password"));
이제 로그인이 성공했습니다!
전체 스택 트레이스를 표시하십시오. – Tair
'Map options'이 비어 있어야합니다. 이미' '에서 모든 옵션을 부여했습니다. –
Tair
해결책을 게시 해 주셔서 대단히 감사드립니다. 그것은 나를 많이 도왔다. – fabstab