Deltaspike和@Stateless Bean

我想用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”文件中,我包括:

  org.apache.deltaspike.security.impl.extension.SecurityInterceptor  

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

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

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

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

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

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

根据beans.xml中定义的bean-discovery-mode,可能无法从CDI容器访问您的UserService。 您应该使用“带注释”的发现模式并使用Dependent注释UserService。

Interesting Posts