Безопасность 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 бизнес-сервиса.