2011-11-10 2 views
11

Я использую JBoss 6.1, и у меня есть безопасный EJB, содержащий методы, аннотированные @RolesAllowed("Admin"). Я пытаюсь проверить этот метод с Аркиллиан.Использование Arquillian для тестирования защищенного EJB

Я успешно выполнил вход EJB в @Before теста, однако ему не удалось вызвать метод. Из журнала TRACE я вижу, что принцип и роли верны (в данном случае 'myuser' и 'Admin'), но информация об методе безопасного EJB неверна (requiredRoles пуст).

TRACE [org.jboss.security.plugins.authorization.JBossAuthorizationContext] Control flag for entry:org.jboss.security.authorization.config.AuthorizationModuleEntry{org.jboss.security.authorization.modules.DelegatingAuthorizationModule:{}REQUIRED}is:[REQUIRED] 
TRACE [org.jboss.security.authorization.modules.ejb.EJBPolicyModuleDelegate] method=public au.com.domain.DTOObject au.com.ejb.SecureServiceBean.save(au.com.domain.DTOObject), interface=Local, requiredRoles=Roles() 
TRACE [org.jboss.security.authorization.modules.ejb.EJBPolicyModuleDelegate] Exception:Insufficient method permissions, principal=myuser, ejbName=SecureServiceBean, method=save, interface=Local, requiredRoles=Roles(), principalRoles=Roles(Admin,) 

Я был в состоянии успешно вызвать метод в том же EJB с @PermitAll.

Я искал документацию Arquillian вокруг защищенного EJB, но не смог найти.

Большое спасибо за помощь.

- Линх

+0

Не могли бы вы высказать свой тестовый код? –

ответ

1

Благодаря Ив Мартин за предложение. Я попытался добавить jboss.xml и ejb-jar.xml, как вы сказали, к сожалению, это не сработало.

Я изучил код снова и снова, и, наконец, я нашел решение этой проблемы. Мой исходный код настройки выглядит следующим образом:

ObjectRepository интерфейс:

public interface ObjectRepository<T extends DomainObject> 
{ 
    public T save(T object); 
    ... 
} 

TaskServiceBeanLocal интерфейс:

@Local 
public interface TaskServiceBeanLocal extends ObjectRepository<Task> 
{ 
} 

Задача EJB:

@Stateless 
@LocalBinding(jndiBinding = TaskServiceBean.LOOKUP_STRING) 
@SecurityDomain(value = Security.DOMAIN) 
@DeclareRoles({ Roles.ADMIN, Roles.CLERK, Roles.READ_ONLY }) 

//By default, allow no one access, we'll enable access at the method level 
@RolesAllowed({}) 
public class TaskServiceBean implements TaskServiceBeanLocal 
{ 
    public static final String LOOKUP_STRING = "TaskServiceBean/local"; 

    @RolesAllowed({ Roles.ADMIN, Roles.CLERK }) 
    @TransactionAttribute(TransactionAttributeType.REQUIRED) 
    @Override 
    public Task save(Task task) 
    { 
     ... 
    } 
} 

Arquillian не удалось получить доступ к TaskServiceBean .save() с ошибкой, как в вопросе:

TRACE [org.jboss.security.authorization.modules.ejb.EJBPolicyModuleDelegate] Exception:Insufficient method permissions, principal=myuser, ejbName=SecureServiceBean, method=save, interface=Local, requiredRoles=Roles(), principalRoles=Roles(Admin,) 

Из журнала TRACE требуемый Roles() пуст по неизвестной причине. Я проверил по реализации другого метода к TaskServiceBeanLocal и TaskServiceBean с тем же разрешением:

@Local 
public interface TaskServiceBeanLocal extends ObjectRepository<Task> 
{ 
    public void test(); 
} 

//and implement the test() method, having the same permission as the save() method. 
public class TaskServiceBean implements TaskServiceBeanLocal 
{ 
    @RolesAllowed({ Roles.ADMIN, Roles.CLERK }) 
    @TransactionAttribute(TransactionAttributeType.REQUIRED) 
    @Override 
    public Task save(Task task) 
    { 
     ... 
    } 

    @RolesAllowed({ Roles.ADMIN, Roles.CLERK }) 
    @TransactionAttribute(TransactionAttributeType.REQUIRED) 
    @Override 
    public void test() 
    { 
     System.out.println("hello"); 
    } 
} 

К моему удивлению, тестирование метод испытания() был успешным.Поэтому я затем переопределяю метод save() в интерфейсе:

@Local 
public interface TaskServiceBeanLocal extends ObjectRepository<Task> 
{ 
    public Task save(Task object); 
    public void test(); 
} 

Теперь тестирование метода save() было успешным. В инструкции журнала TRACE я вижу, что мои обязательные поля полностью заполнены сигнатурой метода.

13:44:35,399 TRACE [org.jboss.security.authorization.modules.ejb.EJBPolicyModuleDelegate] method=public au.com.infomedix.harvey.humantask.domain.Task au.com.infomedix.harvey.ejb.TaskServiceBean.save(au.com.infomedix.harvey.humantask.domain.Task), interface=Local, requiredRoles=Roles(Clerk,Admin,) 

Я думаю, что Arquillian не вводить информацию о безопасности для универсального метода подписи, но если честно, я не совсем понимаю.

Во всяком случае, повторное объявление метода в интерфейсе устраняет проблему. Теперь Аркильян может получить доступ к моему защищенному EJB. Спасибо всем за ваши ценные материалы.

- Linh

2

В JBoss, система безопасности не включена ejb3 фасолью, если вы не установили значение <security-domain> в jboss.xml. Вот reminder for JBoss7, и это также актуально для JBoss 6.1.

Альтернативный вариант заключается в использовании проприетарной аннотации @org.jboss.ejb3.annotation.SecurityDomain с надлежащим значением домена для ваших EJB3-компонентов.

Согласно this forum thread, дескриптор развертывания WEB-INF/jboss-ejb3.xml требуется при развертывании EJBs в файле WAR и здесь является примером для него:

<?xml version="1.0"?> 
<jboss:ejb-jar 
    xmlns:jboss="http://www.jboss.com/xml/ns/javaee" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:s="urn:security" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.jboss.com/xml/ns/javaee http://www.jboss.org/j2ee/schema/jboss-ejb3-2_0.xsd http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd" 
    version="3.1" 
    impl-version="2.0"> 
    <assembly-descriptor> 
    <s:security> 
     <ejb-name>*</ejb-name> 
     <s:security-domain>yourSecurityDomain</s:security-domain> 
    </s:security> 
    </assembly-descriptor> 
</jboss:ejb-jar> 
+0

@ Erica, если ответ не достаточно хорош, пожалуйста, опубликуйте журналы и код, чтобы помочь диагностике –

+0

Я попросил автора оригинала для более подробной информации. Домен безопасности требуется для всей безопасности JBoss, хотя я считаю, что безопасность работает так, как предполагалось, во всех ситуациях * кроме * при доступе через arquillian. – Erica

Смежные вопросы