PicketLink/Deltaspike安全性在SOAP(JAX-WS)层(CDI与EJB?)中不起作用

PicketLink/Deltaspike安全性在SOAP(JAX-WS)层(CDI与EJB?)中不起作用,soap,ejb,cdi,deltaspike,picketlink,Soap,Ejb,Cdi,Deltaspike,Picketlink,我是Spring的长期用户,现在只能切换到JavaEE。有很多事情并没有像预期的那样起作用 我有一个CXF/SOAP服务 @WebService( ... ) @SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE) public interface KlassePortType { ... @WebMethod(...) @WebResult(...) public ListOutputType l

我是Spring的长期用户,现在只能切换到JavaEE。有很多事情并没有像预期的那样起作用

我有一个CXF/SOAP服务

@WebService( ... )
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
public interface KlassePortType { ... 

    @WebMethod(...)
    @WebResult(...)
    public ListOutputType list(@WebParam(...)
            ListInputType request
        );
    ...
    }
实施:

@WebService(...)
public class KlasseImpl  implements KlassePortType { ...

    @Inject
    private KlasseService klasseService;

    @DeclaresRole
    @Override
    public ListOutputType list(ListInputType request) {
        return klasseService.list(request);
    }
}
还有一个KlasseService,它是一个无状态EJB:

@Stateless
public class KlasseService { ...

    @DeclaresRole
    public ListOutputType list(ListInputType listInputType) {
        METHOD LOGIC
    }
... 
}
DeclaresRole注释指定为:

@Retention(value = RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.METHOD })
@Documented
@SecurityBindingType
public @interface DeclaresRole {
}
并具有匹配的DeltaSpike授权人:

@ApplicationScoped
public class CustomAuthorizer {...
    @Secures
    @DeclaresRole
    public boolean doSecuredCheck() throws Exception
    {
        SECURITY CHECK LOGIC
    }
...
}
my beans.xml如下所示:

<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                           http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd" bean-discovery-mode="all">
    <interceptors>
        <class>org.apache.deltaspike.security.impl.extension.SecurityInterceptor</class>
    </interceptors>
</beans>

org.apache.deltaspike.security.impl.extension.SecurityInterceptor
在处理SOAP请求时,CutomAuthorizer代码永远不会被调用(在接口、实现甚至服务EJB上添加注释)。 但是,当从ie.JSF调用的方法使用相同的注释时,一切都按预期工作

我发现了一些相关的问题: 然而,在阅读这篇文章时: 让我觉得EJB容器应该知道CDI拦截器等。 另外,其他的自定义拦截器(@AroundInvoke)也为我工作,JSF请求也如预期的那样得到了保护

我是否遗漏了一些明显的东西,使PicketLink/Deltaspike在SOAP层中可用? 作为替代方案,我可以使用Spring Security+AspectJ切入点,如下所述: 但这听起来很麻烦

另外,我正在使用WildFly 8.2(在WF9上-相同的结果)

我把它整理好了。 带有DeltaSpike SecurityInterceptor的beans.xml必须存在于使用注释的同一模块中。 在我的设置中,它仅在模块中提供安全代码。 此外,它只在任何EJB或CDIBean上工作,除了@WebService(这里是WF8/9上的CXF)——正如@JohnAment所建议的那样,我假设SOAP端点不会自动注册到EJB/CDI上下文中,因此无法通过此注释直接保护

将@Stateless添加到alredy present@WebService会阻止部署应用程序:

JBAS017312: KlasseImpl has the wrong component type, it cannot be used as a web component

无论如何,我相信业务逻辑应该与SOAP(或任何其他)端点分离,因此我成功地使用了注入到SOAP业务服务中的注释。

您的SOAP端点上似乎没有托管容器注释。你是在给它做注释吗
@Stateless
?这将是我尝试的第一件事。WebService终结点不会自动成为无状态会话bean。@JohnAment这会导致部署异常:JBAS017312:KlasseImpl的组件类型错误,无法用作web组件,在JEE世界中似乎不正确。无论如何,我怀疑这与CXF内部使用Spring进行配置有关,因此JEE bean对于CXF Web服务是可见的,但是JEE bean(和DeltaSpike拦截器)没有看到Web服务。该文档非常陈旧,已经过时(与您正在使用的文档相比)。您需要提供完整的异常并更新问题以反映您实际尝试的内容。