2011-11-10 60 views
11

我正在使用JBoss 6.1,並且我得到了一個安全的EJB,其方法註解爲@RolesAllowed("Admin")。我試圖用Arquillian測試這種方法。使用Arquillian測試安全的EJB

我在測試的@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文檔,但找不到任何文檔。

非常感謝您的幫助。

- 靈

+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日誌記錄中,由於未知原因,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"); 
    } 
} 

令我驚訝的是,檢測試驗()方法是成功的。因此,我然後在界面中重新聲明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。感謝大家的寶貴意見。

- Linh

2

在JBoss中,安全系統上沒有EJB3豆如果你還沒有在jboss.xml設置<security-domain>值啓用。這是一個reminder for JBoss7,它也與JBoss 6.1相關。

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

根據this forum thread,部署描述符WEB-INF/jboss-ejb3.xml在WAR文件部署EJB和這裏的時候需要的就是它的一個示例:

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