簡體   English   中英

使用Arquillian測試安全EJB

[英]Use Arquillian to test secure EJB

我正在使用JBoss 6.1,我得到了一個安全的EJB,其中的方法用@RolesAllowed("Admin")注釋。 我試圖用Arquillian測試這個方法。

我已經在測試的@Before中成功完成了EJB登錄,但是,它無法調用該方法。 從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,)

我能夠使用@PermitAll在同一個EJB中成功調用一個方法。

我已經查找了關於安全EJB的Arquillian文檔,但找不到任何文檔。

非常感謝您的幫助。

- 林

在JBoss中,如果尚未在jboss.xml設置<security-domain>值,則不會在EJB3 bean上啟用安全系統。 這是對JBoss7提醒 ,它也與JBoss 6.1有關。

另一種選擇是使用專有注釋@org.jboss.ejb3.annotation.SecurityDomain ,並在EJB3 bean上使用適當的域值。

根據此論壇主題 ,在WAR文件中部署EJB時需要部署描述符WEB-INF/jboss-ejb3.xml ,以下是一個示例:

<?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>

謝謝Yves Martin的建議。 我已經嘗試按照你的建議添加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日志記錄中,requiredRoles()由於未知原因而為空。 我通過對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");
    }
}

令我驚訝的是,測試test()方法是成功的。 然后我重新聲明接口中的save()方法:

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

現在,測試save()方法是成功的。 在TRACE日志記錄語句中,我可以看到我的requiredRoles完全填充在方法簽名中。

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沒有為通用方法簽名注入安全信息,但說實話,我並不完全理解。

無論如何,在界面中重新聲明方法可以解決問題。 Arquillian現在可以訪問我的安全EJB。 感謝大家的寶貴意見。

- 林

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM