2016-02-04 47 views
9

Mam punkt końcowy REST w mojej aplikacji, który jest chroniony przez zabezpieczenia EJB.Zastąp węzeł EJBAccessException Stacktrace Logged by JBoss

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

Jeśli czasy sesji użytkownika OUT web-app nie wie, że jeśli staram się współpracować z nim robi 403. która jest całkowicie OK. Ale w dzienniku serwera ten błąd wygląda następująco:

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] 

Te wiadomości są tak długie i bezużyteczne. Chcę zamienić je w dzienniku na "WARN: Nieautoryzowany dostęp" plus może jakieś dodatkowe dane, ale bez śladu stosu. Nie mam pojęcia, jak to zrobić, ponieważ ta wiadomość jest rejestrowana przez JBoss. Doceniam poradę, w jaki sposób mogę osiągnąć pożądany!

+0

Możesz zredukować szum w śladach stosu, jeśli korzystasz z funkcji Logback do rejestrowania. Od wersji 1.13 w górę, może filtrować stosy stacków (ta funkcja nie jest jeszcze udokumentowana). E. g. % m% n% REX {pełny, org.jboss., Sun.reflect. }

Odpowiedz

0

Moje badania wykazały, że jednym z możliwych rozwiązań jest użycie Container Interceptors, które istniało we wcześniejszych wersjach JBoss AS i pojawiło się ponownie w JBoss AS 7.2. Ale nie ma czegoś takiego w 7.1.1 i przez zbieg okoliczności, to jest moja wersja JBoss. Dopóki mój szef nie zdecyduje, że powinniśmy przenieść się do WildFly, otwieram nagrodę, na wypadek gdyby ktoś miał alternatywne rozwiązanie (NIE, nie skompiluję własnego JBoss AS z łatkami).

+1

To nie zapewnia odpowiedzi na pytanie. Aby skrytykować lub poprosić o wyjaśnienie od autora, pozostaw komentarz pod swoim postem. - [Z recenzji] (/ opinia/niskiej jakości-posts/11203717) – hotzst

+1

Jestem autorem. Niestety jest to jak na razie najbardziej poprawna odpowiedź. I będę musiał zaakceptować własną odpowiedź prędzej czy później, chyba że ktoś zaproponuje rozwiązanie JBoss 7.1.1. Nie lubię zostawiać własnych pytań bez odpowiedzi, więc napisałem jedyną odpowiedź, którą mam. Zapraszamy do złożenia kolejnego. –

+0

Tak jak obiecałem, akceptuję własną odpowiedź. Nikt nie zaproponował działającego rozwiązania. Większość ludzi nawet nie próbowała być zbyt zajęta głosowaniem, aby zamknąć tę odpowiedź. Nadal jest trochę czasu dla każdego, kto chce nagrody. –

2

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

ExceptionMappers są niestandardowe, wniosek zawierał składniki, które mogą połowów rzucony wyjątek aplikacji i napisać konkretne odpowiedzi HTTP

zarejestrować je w web.xml:

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

Przykro mi, ale to nie zadziała, ponieważ wyjątkowi twórcy map wchodzą w grę dużo później. Autoryzacja jest obsługiwana przez EJB w moim przypadku i ma miejsce przed wywołaniem metod RestEasy. ExceptionMapper był pierwszą rzeczą, o której myślę. –

0

Chcę zamienić je w dzienniku na "WARN: Nieautoryzowany dostęp", a być może niektóre dodatkowe dane:

JBoss obsługuje niestandardowe rejestratory. Nie jestem pewien, czy możesz skonfigurować jego rejestrowanie, aby wpłynęło na każdą klasę, ale jeśli jest to możliwe, dostrajanie rejestrowania (zamiast przechwytywania itd.) Jest naturalnym sposobem działania.

+0

Jest szansa, że ​​to podejście pomoże usunąć ślady stosów. Ale co z niestandardową wiadomością? –

+0

Nie jestem ekspertem od JBoss, ale sądzę, że jeśli zaimplementujesz niestandardowy program rejestrujący, będziesz mógł napisać niestandardową wiadomość do dziennika. –

+0

Zostało mi tylko 18 minut na przydzielenie nagrody. Takie podejście jest nieoczekiwane, ale ma prawo istnieć. Myślę, że zasługuje na trochę RP. –