2011-11-10 8 views
11

Estoy usando JBoss 6.1 y tengo un EJB seguro con métodos anotados con @RolesAllowed("Admin"). Estoy tratando de probar este método con Arquillian.Utilice Arquillian para probar EJB seguro

He hecho el registro EJB con éxito en el @Before de la prueba, sin embargo, no ha podido invocar el método. Desde el registro TRACE, puedo ver que el principal y las funciones son correctas (en este caso, 'myuser' y 'Admin'), pero la información del método del EJB seguro es incorrecta (requiredRoles están vacías).

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,) 

I fue capaz de invocar con éxito un método en el mismo EJB con @PermitAll.

He buscado documentación de Arquillian sobre EJB seguro, pero no he podido encontrar ninguna.

Muchas gracias por su ayuda.

- Linh

+0

¿Podría publicar el código de la prueba? –

Respuesta

1

Gracias Yves Martin por la sugerencia. He intentado agregar jboss.xml y ejb-jar.xml como sugirió, desafortunadamente no funcionó.

He examinado el código una y otra vez, y finalmente he encontrado una solución a este problema. Mi código original establecido es el siguiente:

interfaz OBJECTREPOSITORY:

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

interfaz TaskServiceBeanLocal:

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

Tarea 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) 
    { 
     ... 
    } 
} 

El Arquillian pudo tener acceso a la TaskServiceBean Método .save() con el error como en la pregunta:

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,) 

Desde el registro TRACE, el requeridoRoles() está vacío por un motivo desconocido. He probado mediante la implementación de un método diferente para la TaskServiceBeanLocal y la TaskServiceBean con el mismo permiso:

@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"); 
    } 
} 

Para mi sorpresa, poniendo a prueba el método test() se ha realizado correctamente.Entonces redeclaro el método save() en la interfaz:

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

Ahora, probando el método save() fue exitoso. En la declaración de registro TRACE, puedo ver que mis Roles requeridos están completamente llenos en la firma del método.

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,) 

Mi conjetura es que Arquillian no inyectar la información de seguridad de la firma del método genérico, pero la verdad es que no entiendo plenamente.

De todos modos, volver a declarar el método en la interfaz soluciona el problema. Arquillian puede acceder a mi EJB seguro ahora. Gracias a todos por sus valiosas aportaciones.

- Linh

2

En JBoss, el sistema de seguridad no está habilitada en los granos de EJB3 si no se ha establecido un valor <security-domain> en jboss.xml. Aquí hay un reminder for JBoss7 y también es relevante para JBoss 6.1.

Una opción alternativa es utilizar la anotación propietaria @org.jboss.ejb3.annotation.SecurityDomain con el valor de dominio adecuado en los beans EJB3. , Un descriptor de despliegue WEB-INF/jboss-ejb3.xml es necesario cuando el despliegue de EJB en un archivo WAR y aquí

Según this forum thread es un ejemplo de ello:

<?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 si la respuesta no es lo suficientemente buena, publique registros y código para ayudar con el diagnóstico –

+0

Le pedí al autor original que me brindara más detalles. Sin embargo, el dominio de seguridad es obligatorio para toda la seguridad de JBoss, y creo que la seguridad funciona según lo previsto en todas las situaciones * excepto * cuando se accede a través de arquillian. – Erica

Cuestiones relacionadas