私は長年の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);
}
}
また、ステートレス EJB である KlasseService:
@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>
SOAP リクエストが処理されている場合、 CutomAuthorizer コードは呼び出されません(インターフェース、実装、さらにはサービス - EJB に注釈を付けます)。ただし、同じアノテーションがie から呼び出されるメソッドに使用されている場合。JSF - すべてが期待どおりに機能します。
関連する質問がいくつか見つかりました: Deltaspike と @Stateless Bean ただし、これを読んで: EJB 3.1 と CDI を使用する場所は? EJBコンテナはCDIインターセプターなどを認識する必要があると思います。また、他のカスタムインターセプター(@AroundInvoke)が機能し、JSFリクエストは期待どおりに保護されています。
PicketLink/Deltaspike を SOAP レイヤーで使用できるようにする明らかな何かが欠けていますか? 別の方法として、Spring Security + AspectJ ポイントカットを使用することもできます : http://forum.spring.io/forum/spring-projects/security/119811-method-security-java-ee-cdi面倒くさい……。
PS。私はWildFly 8.2を使用しています(WF9で-同じ結果)