3

私は長年の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で-同じ結果)

4

1 に答える 1