Безопасность PicketLink / Deltaspike не работает на уровне SOAP (JAX-WS) (CDI против EJB?)

Я давно пользуюсь Spring, теперь мне нужно было переключиться только на Java EE. Есть много вещей, которые просто не работают, как ожидалось...

У меня есть сервис 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
    }
...
}

мой файл 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>

Код CutomAuthorizer никогда не вызывается при обработке запроса SOAP (добавьте аннотацию для интерфейса, реализации и даже службы - EJB). Однако, когда одна и та же аннотация используется для методов, вызываемых из ie. JSF - все работает как положено.

Я нашел некоторый связанный вопрос: Deltaspike и @Stateless Bean Однако читая это: Где использовать EJB 3.1 и CDI? заставляет меня думать, что EJB-контейнер должен знать о перехватчиках CDI и т. д. Также у меня работают другие, настраиваемые перехватчики (@AroundInvoke), и запросы JSF защищаются, как и ожидалось.

Я упускаю что-то очевидное, что сделает PicketLink/Deltaspike пригодным для использования на уровне SOAP? В качестве альтернативы я могу пойти с Springpoint + AspectJ pointcut, как описано: http://forum.spring.io/forum/spring-projects/security/119811-method-security-java-ee-cdi но это звучит так много хлопот....

PS. Я использую WildFly 8.2 (на WF9 - те же результаты)

1 ответ

Решение

Я разобрался с этим. beans.xml с DeltaSpike SecurityInterceptor должен присутствовать в том же модуле, в котором используется аннотация. В моей настройке это было только в модуле, который обеспечивает защитный код. Кроме того, он работает только для любого EJB или CDI-компонента, за исключением @WebService (здесь CXF для WF8/9) - как предполагает @JohnAment. Я предполагаю, что конечные точки SOAP не регистрируются автоматически в контексте EJB/CDI, поэтому не могут быть защищены напрямую эта аннотация.

Добавление @Stateless к уже существующему @WebService предотвращает развертывание приложения:

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

В любом случае, я считаю, что бизнес-логика должна быть отделена от конечной точки SOAP (или любой другой), поэтому я успешно использую аннотацию для внедренного в SOAP бизнес-сервиса.

Другие вопросы по тегам