Lin*_*inh 11 java security integration-testing ejb jboss6.x
我正在使用JBoss 6.1,我得到了一个带有注释方法的安全EJB @RolesAllowed("Admin").我试图用Arquillian测试这个方法.
我已经@Before在测试中成功完成了EJB日志,但是,它无法调用该方法.从TRACE日志中,我可以看到主体和角色是正确的(在这种情况下,'myuser'和'Admin'),但安全EJB的方法信息是错误的(requiredRoles为空).
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,)
Run Code Online (Sandbox Code Playgroud)
我能够在同一个EJB中成功调用一个方法@PermitAll.
我已经查找了关于安全EJB的Arquillian文档,但找不到任何文档.
非常感谢您的帮助.
- 林
感谢伊夫·马丁的建议。我已尝试按照您的建议添加 jboss.xml 和 ejb-jar.xml ,不幸的是它不起作用。
我反复检查代码,终于找到了解决这个问题的方法。我原来的代码设置如下:
对象存储库接口:
public interface ObjectRepository<T extends DomainObject>
{
public T save(T object);
...
}
Run Code Online (Sandbox Code Playgroud)
TaskServiceBeanLocal接口:
@Local
public interface TaskServiceBeanLocal extends ObjectRepository<Task>
{
}
Run Code Online (Sandbox Code Playgroud)
任务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)
{
...
}
}
Run Code Online (Sandbox Code Playgroud)
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,)
Run Code Online (Sandbox Code Playgroud)
从 TRACE 日志记录来看,requiredRoles() 为空,原因未知。我通过对具有相同权限的 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");
}
}
Run Code Online (Sandbox Code Playgroud)
令我惊讶的是,测试 test() 方法成功了。所以我然后在接口中重新声明 save() 方法:
@Local
public interface TaskServiceBeanLocal extends ObjectRepository<Task>
{
public Task save(Task object);
public void test();
}
Run Code Online (Sandbox Code Playgroud)
现在,测试 save() 方法成功了。在 TRACE 日志记录语句中,我可以看到我的 requiredRoles 已完全填充在方法签名中。
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,)
Run Code Online (Sandbox Code Playgroud)
我的猜测是 Arquillian 没有注入通用方法签名的安全信息,但老实说我并不完全理解这一点。
无论如何,在接口中重新声明方法可以解决问题。Arquillian 现在可以访问我的安全 EJB。感谢大家的宝贵意见。
——林
| 归档时间: |
|
| 查看次数: |
2335 次 |
| 最近记录: |