我想用DeltaSpike- EJb来保护我的“无状态”API。
@Stateless
@Remote(UserServiceRemote.class)
public class UserService implements UserServiceRemote在方法级别,我有一个自定义的注解"Support“
@Support
public void doSomething() {}因此我写了一个自定义注释"@Support":
@Retention(value = RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD })
@Documented
@SecurityBindingType
public @interface Support {我的自定义Authorizer如下所示:
@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“方法之后,"Support”注释被忽略了,无论我是否拥有该角色。
我哪里做错了?感谢所有的建议!
发布于 2014-11-07 14:19:43
Ejb和CDI是两个不同的概念。无状态会话bean和托管CDI bean由不同的容器管理。因此您不能在无状态会话bean上使用Deltaspike。如果要使用deltaspike安全性,请改用命名bean并使用不同的远程处理策略。
发布于 2015-09-08 04:30:27
在我的例子中,我必须确保包含我想要用注释保护的服务的模块(jar)中有带deltaspike拦截器的beans.xml文件(以前我只将该文件添加到带有安全代码本身的模块中,这是一个问题)。
我还发现,我必须将业务逻辑服务与SOAP端点声明本身分开。此自定义EJB @Stateles (或任何其他)服务可以@注入到SOAP中,安全注释(此处为@Support)将在其上工作。
在我看来,将端点声明与业务代码分离无论如何都是一个很好的设计,因为我们可能会有多个接口调用相同的业务逻辑。(而且更容易进行单元测试等)
https://stackoverflow.com/questions/26781257
复制相似问题