3

匿名のWebServiceEJBがあります-Webサービス呼び出しは正常に機能しています。

ここで、WebServiceを特定のSecurityRoleとして実行する必要があります。

Webサービスでは、次の注釈があります。

@Stateless
@WebService
@DeclareRoles({ "LoggedUser" })
@SecurityDomain("my-jboss-real")
@RunAs("LoggedUser")
public class MyWebService { ...

ここで、Webサービスメソッドから@EJBwithにアクセスしたいと思います。@RolesAllowed({"LoggedUser"})

ERROR [org.jboss.aspects.tx.TxPolicy] javax.ejb.EJBTransactionRolledbackException: javax.ejb.EJBAccessException.message: 'Caller unauthorized'
WARN  [org.jboss.ejb3.stateless.StatelessBeanContext] EJBTHREE-1337: do not get WebServiceContext property from stateless bean context, it should already have been injected
ERROR [org.jboss.ws.core.jaxws.SOAPFaultHelperJAXWS] SOAP request exception
javax.ejb.EJBTransactionRolledbackException: javax.ejb.EJBAccessException.message: 'Caller unauthorized'
        at org.jboss.ejb3.tx.Ejb3TxPolicy.handleInCallerTx(Ejb3TxPolicy.java:115)

JBoss5.1GAで実行しています

これは正しい使用法ですか、@RunAsそれともこれを行う別の方法がありますか。

編集

追加した:

@Resource
private WebServiceContext wsCtx;
@Resource
private EJBContext ejbCtx;

myWebServiceMethod(){
     ...
     System.out.println("EJBCtx: " + ejbCtx.getCallerPrincipal());
     System.out.println("EJBCtx: " + ejbCtx.isCallerInRole("LoggedUser"));
     System.out.println("WebContext: " + wsCtx.getUserPrincipal());
     System.out.println("WebContext: " + wsCtx.isUserInRole("LoggedUser"));
     ...

この出力:

EJBCtx: anonymous
EJBCtx: false
WebContext: anonymous
WebContext: false
4

1 に答える 1

4

JBoss AS 5、特に6は、セキュリティコンテキストと、最も基本的なユースケース以外の@RunAsに関して非常にバグがあります。

AS 7では、これらのバグの多くが修正されています。そこでテストケースをセットアップして、同じ問題が発生するかどうかを確認できます。

@RunAsは、アノテーションが適用されているBeanで実行されるコードには適用されないことに注意してください。代わりに、そのBeanから-from-と呼ばれるBeanにのみ適用されます。あなたはそれを「発信/発信」の役割と考えることができます。

さらに厄介なのは、Java EEに重大な欠落があり、RunAsIDも定義する方法がないことです。「認証されていない」IDのRunAsロールを定義すると、一部のサーバーは適切に反応しません。JBossには、RunAs識別用の独自のアノテーションがあります。これでさらに一歩進んだ場合は、試してみることをお勧めします。

于 2012-09-22T19:28:30.213 に答える