3

我想用 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>

但是在我登录我的应用程序并在每次远程调用时调用“doSomething”方法后,“支持”注释将被忽略,无论我是否有这个角色。

我做错了什么?谢谢大家的建议!!!

4

2 回答 2

2

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

于 2014-11-07T06:19:43.390 回答
0

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

我还发现我必须将业务逻辑服务与 SOAP 端点声明本身分开。这个自定义的 EJB @Stateles(或任何其他)服务可以@Inject-ed 到 SOAP 中,并且安全注释(此处为 @Support)将对其起作用。

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

于 2015-09-07T20:30:27.107 回答