2011-11-10 30 views
11

Tôi đang sử dụng JBoss 6.1 và tôi nhận được EJB an toàn có các phương pháp được chú thích với @RolesAllowed("Admin"). Tôi đang thử nghiệm phương pháp này với Arquillian.Sử dụng Arquillian để kiểm tra an toàn EJB

Tôi đã thực hiện đăng nhập EJB thành công trong thử nghiệm @Before, tuy nhiên, nó không thể gọi phương thức. Từ nhật ký TRACE, tôi có thể thấy rằng hiệu trưởng và vai trò là chính xác (trong trường hợp này là 'myuser''Admin'), nhưng thông tin phương pháp EJB an toàn là sai (requiredRoles trống).

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

Tôi đã có thể gọi thành công một phương thức trong cùng một EJB với @PermitAll.

Tôi đã tìm tài liệu Arquillian xung quanh EJB an toàn, nhưng không thể tìm thấy bất kỳ tài liệu nào.

Rất cám ơn sự giúp đỡ của bạn.

- Linh

+0

Bạn có thể đăng mã thử nghiệm của mình không? –

Trả lời

1

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

2

Trong JBoss, hệ thống an ninh không được kích hoạt trên đậu EJB3 nếu bạn chưa thiết lập một giá trị <security-domain> trong jboss.xml. Đây là một reminder for JBoss7 và nó cũng có liên quan cho JBoss 6.1.

Tùy chọn thay thế là sử dụng chú thích độc quyền @org.jboss.ejb3.annotation.SecurityDomain với giá trị tên miền thích hợp trên hạt EJB3 của bạn.

Theo this forum thread, một bộ mô tả triển khai WEB-INF/jboss-ejb3.xml được yêu cầu khi triển khai các EJB trong một tập tin WAR và đây là một ví dụ cho nó:

<?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 nếu câu trả lời không đủ tốt, vui lòng xuất bản nhật ký và mã để giúp chẩn đoán –

+0

Tôi đã nhắc tác giả gốc để biết thêm chi tiết. Tuy nhiên, miền bảo mật là bắt buộc đối với tất cả bảo mật JBoss và tôi tin rằng bảo mật hoạt động như dự định trong mọi tình huống * ngoại trừ * khi được truy cập thông qua arquillian. – Erica

Các vấn đề liên quan