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
¿Podría publicar el código de la prueba? –