Deltaspike和@Stateless Bean

时间:2014-11-06 13:56:31

标签: java security ejb-3.1 deltaspike

我想保护我的"无状态"带有DeltaSpike-API的EJb。

@Stateless
@Remote(UserServiceRemote.class)
public class UserService implements UserServiceRemote

在方法级别,我有一个自定义注释"支持"

@Support
public void doSomething() {}

因此我写了一个自定义注释" @ Support":

@Retention(value = RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD })
@Documented
@SecurityBindingType
public @interface Support {

我的自定义授权工具如下:

@Secures
@Support
public boolean doAdminCheck(Identity identity, IdentityManager identityManager, RelationshipManager relationshipManager)
            throws Exception {      
    return hasRole(relationshipManager, identity.getAccount(), getRole(identityManager, "Support"));
}

在我的" beans.xml"文件我包括:

<interceptors>
    <class>org.apache.deltaspike.security.impl.extension.SecurityInterceptor</class>
</interceptors>

但是在我登录我的应用程序并打电话给&#34; doSomething&#34;远程调用方法&#34;支持&#34;无论我是否有角色,都会忽略注释。

我做错了什么?所有建议都是Thanx !!!

2 个答案:

答案 0 :(得分:2)

Ejb和CDI是两个不同的概念。无状态会话bean和托管CDI bean由不同的容器管理。所以你不能在无状态会话bean上使用Deltaspike。 如果要使用deltaspike安全性,请改用命名bean并使用不同的远程处理策略。

答案 1 :(得分:0)

在我的情况下,我必须确保包含我想要使用注释保护的服务的模块(jar)具有带有deltaspike拦截器的beans.xml文件(之前我只是将文件添加到带有安全代码本身的模块,这是一个问题)。

此外,我发现我必须将业务逻辑服务与SOAP端点声明本身分开。 这个自定义EJB @Stateles(或任何其他)服务可以@Inject-ed到SOAP中,安全注释(这里是@Support)也适用于它。

在我看来,端点声明与业务代码的分离无论如何都是好的设计,因为我们可能有多个接口调用相同的业务逻辑。 (并且它更容易进行单元测试等。)