Благодаря Ив Мартин за предложение. Я попытался добавить 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
Не могли бы вы высказать свой тестовый код? –