Cảm ơn Yves Martin cho đề nghị này. Tôi đã thử thêm jboss.xml và ejb-jar.xml như bạn đã đề xuất, tiếc là nó không hoạt động.
Tôi đã kiểm tra mã một lần nữa và một lần nữa, và cuối cùng tôi đã tìm thấy một giải pháp cho vấn đề này. mã ban đầu tôi thiết lập như sau:
giao diện ObjectRepository:
public interface ObjectRepository<T extends DomainObject>
{
public T save(T object);
...
}
giao diện TaskServiceBeanLocal:
@Local
public interface TaskServiceBeanLocal extends ObjectRepository<Task>
{
}
công tác 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)
{
...
}
}
Các Arquillian thất bại trong việc truy cập vào TaskServiceBean phương thức .save() với lỗi như trong câu hỏi:
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,)
Từ ghi nhật ký TRACE, yêu cầuRoles() trống vì lý do không xác định. Tôi đã thử nghiệm bằng cách thực hiện một phương pháp khác nhau để các TaskServiceBeanLocal và TaskServiceBean với sự cho phép cùng:
@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");
}
}
Trước sự ngạc nhiên của tôi, kiểm tra các phương pháp thử nghiệm() đã thành công.Vì vậy, tôi sau đó redeclare phương thức save() trong giao diện:
@Local
public interface TaskServiceBeanLocal extends ObjectRepository<Task>
{
public Task save(Task object);
public void test();
}
Bây giờ, thử nghiệm phương thức save() đã thành công. Trong câu lệnh đăng nhập TRACE, tôi có thể thấy các yêu cầu của mình được điền đầy đủ vào chữ ký phương thức.
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,)
tôi đoán là Arquillian không tiêm các thông tin bảo mật cho chữ ký phương pháp chung chung, nhưng thật sự tôi không hoàn toàn hiểu điều đó.
Tuy nhiên, việc khai báo lại phương thức trong giao diện sẽ khắc phục được sự cố. Arquillian có thể truy cập EJB được bảo vệ của tôi ngay bây giờ. Cảm ơn tất cả mọi người cho đầu vào có giá trị của bạn.
- Linh
Bạn có thể đăng mã thử nghiệm của mình không? –