2016-02-04 16 views
9

私のアプリケーションには、EJBセキュリティで保護されたRESTエンドポイントがあります。ウェブアプリアウトユーザーのセッション時間は、それを知らないと、私はそれと対話しようとした場合、それは完全にOKであるFORBIDDEN 403を取得しJBossによって記録されたEJBAccessException stacktraceを置き換えます。

@Path("/somepath") 
@Produces(MediaType.APPLICATION_JSON) 
@Stateless 
@SecurityDomain("mydomain") 
@RolesAllowed({"user"}) 
public class MyResource extends AbstractResource 

場合。しかし、サーバーログでは、このエラーは次のようになります。

14:47:52,682 ERROR [org.jboss.ejb3.invocation] (http--127.0.0.1-8080-5) JBAS014134: EJB Invocation failed on component MyResource for method public java.lang.String MyResource.getSupplies(): javax.ejb.EJBAccessException: JBAS014502: Invocation on method: public java.lang.String MyResource.getSupplies() of bean: MyResource is not allowed 
     at org.jboss.as.ejb3.security.AuthorizationInterceptor.processInvocation(AuthorizationInterceptor.java:101) [jboss-as-ejb3-7.1.1.Final.jar:7.1.1.Final] 
     at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288) [jboss-invocation-1.1.1.Final.jar:1.1.1.Final] 
     at org.jboss.as.ejb3.security.SecurityContextInterceptor.processInvocation(SecurityContextInterceptor.java:76) [jboss-as-ejb3-7.1.1.Final.jar:7.1.1.Final] 
     at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288) [jboss-invocation-1.1.1.Final.jar:1.1.1.Final] 
     at org.jboss.as.ejb3.component.interceptors.LoggingInterceptor.processInvocation(LoggingInterceptor.java:59) [jboss-as-ejb3-7.1.1.Final.jar:7.1.1.Final] 
     at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288) [jboss-invocation-1.1.1.Final.jar:1.1.1.Final] 
     at org.jboss.as.ee.component.NamespaceContextInterceptor.processInvocation(NamespaceContextInterceptor.java:50) [jboss-as-ee-7.1.1.Final.jar:7.1.1.Final] 
     at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288) [jboss-invocation-1.1.1.Final.jar:1.1.1.Final] 
     at org.jboss.as.ejb3.component.interceptors.AdditionalSetupInterceptor.processInvocation(AdditionalSetupInterceptor.java:32) [jboss-as-ejb3-7.1.1.Final.jar:7.1.1.Final] 
     at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288) [jboss-invocation-1.1.1.Final.jar:1.1.1.Final] 
     at org.jboss.as.ee.component.TCCLInterceptor.processInvocation(TCCLInterceptor.java:45) [jboss-as-ee-7.1.1.Final.jar:7.1.1.Final] 
     at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288) [jboss-invocation-1.1.1.Final.jar:1.1.1.Final] 
     at org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:61) [jboss-invocation-1.1.1.Final.jar:1.1.1.Final] 
     at org.jboss.as.ee.component.ViewService$View.invoke(ViewService.java:165) [jboss-as-ee-7.1.1.Final.jar:7.1.1.Final] 
     at org.jboss.as.ee.component.ViewDescription$1.processInvocation(ViewDescription.java:173) [jboss-as-ee-7.1.1.Final.jar:7.1.1.Final] 
     at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288) [jboss-invocation-1.1.1.Final.jar:1.1.1.Final] 
     at org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:61) [jboss-invocation-1.1.1.Final.jar:1.1.1.Final] 
     at org.jboss.as.ee.component.ProxyInvocationHandler.invoke(ProxyInvocationHandler.java:72) [jboss-as-ee-7.1.1.Final.jar:7.1.1.Final] 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [rt.jar:1.7.0_55] 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) [rt.jar:1.7.0_55] 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [rt.jar:1.7.0_55] 
     at java.lang.reflect.Method.invoke(Method.java:606) [rt.jar:1.7.0_55] 

これらのメッセージは長すぎるため無駄です。私はログでそれらを "WARN:Unauthorized access"のようなものに置き換え、さらにいくつかの追加データを入れたいがスタックトレースは入れない。私はこのメッセージがJBossによって記録されているので、どうすればいいのかわかりません。 アドバイスをいただければ幸いです。

+0

ロギングにLogbackを使用すると、スタックトレースのノイズを減らすことができます。バージョン1.13以降では、スタックトレースをフィルタリングできます(この機能はまだ文書化されていません)。 E. <アペンダ名= "STDOUT" クラス= "ch.qos.logback.core.ConsoleAppender"> %のM%N%レックス{フル、org.jboss。、sun.reflect。 }

答えて

0

私の研究は、以前のバージョンのJBoss ASに存在し、JBoss AS 7.2に再び登場したContainer Interceptorsを使用することを考えました。しかし、7.1.1にそのようなことはなく、偶然にもJBossの私のバージョンです。私の上司がWildFlyに移行する必要があると判断するまで、誰かが代替ソリューションを持っている場合に備えて、私は賞品を発行しています(いいえ、自分のJBoss ASをパッチでコンパイルしません)。

+1

これは質問への答えを提供しません。批評をしたり、著者の説明を求めるには、投稿の下にコメントを残してください。 - [レビューの投稿者](レビュー/低品質の投稿/ 11203717) – hotzst

+1

私は著者です。残念ながらこれは今までのところ最も有効な答えです。誰かがJBoss 7.1.1のためのソリューションを提案しない限り、遅かれ早かれ自分の答えを受け入れる必要があります。私は答えなしで私自身の質問を残したくないので、私が持っている唯一の答えを掲示した。あなたは別のものを提出することを歓迎します。 –

+0

私は約束したとおり、私は自分の答えを受け入れています。誰も解決策を提案していません。ほとんどの人はこの答えを閉じるのに忙しいと投票しようとしなかった。報酬を欲しがっている人にはまだ時間があります。 –

2

You should register an ExceptionMapper with RestEasy and do what you want in that handler.

ExceptionMappersはあなたがweb.xmlに登録し、特定のHTTPレスポンス

を キャッチスローアプリケーションの例外とを書き込むことができ、カスタム、提供されたアプリケーション、コンポーネントです:

<context-param> 
     <param-name>resteasy.providers</param-name> 
     <param-value>fully.qualified.package.to.your.CustomEJBAccessExceptionMapper</param-value> 
</context-param> 
+0

申し訳ありませんが、これは動作しません。これは、例外マッパーが後で動作するためです。承認は私のケースではEJBによって処理され、RestEasyメソッドを呼び出す前に行われます。 ExceptionMapperも私の最初のことでした。 –

0

ログでそれらを "WARN:Unauthorized access"と追加のデータで置き換えたい場合

JBossはカスタムロガーをサポートしています。私はあなたがそれが各クラスに影響を及ぼすようにロギングを設定できるかどうかは確信していませんが、可能ならば(インターセプタの代わりに)ロギングをチューニングするのは自然な方法です。

+0

このアプローチがスタックトレースを削除するのに役立つ可能性があります。しかしカスタムメッセージはどうですか? –

+0

私はJBossのエキスパートではありませんが、カスタムロガーを実装すると、カスタムメッセージをログに書き込むことができます。 –

+0

報酬を割り当てるのに18分しかかかりません。このアプローチは予想外ですが、存在する権利があります。私はそれがいくつかのRPに値すると思う。 –