2011-01-07 8 views
10

Używając @ before, jest używany tylko w jednej klasie. Jak zastosować filtr globalny w playframework? Tak więc jeden filtr jest używany dla wszystkich klas kontrolerów.Jak zastosować filtr globalny w playframework

+0

Wiąże się to z moim pytaniem http://stackoverflow.com/questions/4597766/easy-way-to-use-secure- moduły lub podobne do wszystkich kontrolerów w grze. Próbowałem użyć wzmacniacza kodu bajtowego, aby dodać adnotację '@ With' do wszystkich kontrolerów, ale to doprowadziło mnie do tego pytania: http://stackoverflow.com/questions/4608883/problem-with-classes-not-found-during -playplugin-enhance –

+0

http://www.playframework.com/documentation/2.1.0/ScalaInterceptors – ThePizzle

Odpowiedz

6

Prostym rozwiązaniem jest rozszerzenie kontrolera podstawowego dla wszystkich kontrolerów i ustawienie @Before w kontrolerze bazowym.

Inną opcją (i lepszym rozwiązaniem, ponieważ jest bardziej elastyczna) jest użycie @ Adnotacji. Przykładem na dokumentacji Play jest

Przykład:

public class Secure extends Controller { 

    @Before 
    static void checkAuthenticated() { 
     if(!session.containsKey("user")) { 
      unAuthorized(); 
     } 
    } 
}  

A na innym Kontroler:

@With(Secure.class) 
public class Admin extends Application { 

    ... 

} 

Oznacza to, że kontroler Administrator przetwarza wszystkie przechwytujących (@Before, @After @ Wreszcie) zawarte w bezpiecznym kontrolerze.

+2

Niestety nadal wymaga to dodania adnotacji '@ With 'do wszystkich kontrolerów. Szczególnie w przypadku wtyczki Secure, lepiej byłoby móc domyślnie zabezpieczyć wszystkie kontrolery, a następnie dodać do białej listy te, które powinny być publicznie dostępne. Nie wiem jeszcze, jak to zrobić. –

+0

zgodził się, nie podoba mi się tutaj rozwiązanie, ponieważ każdy programista musi pamiętać, a ludzkie zachowanie mówi, że w pewnym momencie zostanie zapomniane. –

1

Możesz po prostu użyć PlayPlugin dla tego problemu. Aby uzyskać więcej informacji, patrz here.

+0

troska o opracowanie trochę? –

+0

Przepraszam, że ostatnio się spieszyłem. Możesz znaleźć tu informacje: http://stackoverflow.com/questions/4515627/how-to-get-beforeactioninvocation-and-actiontervocation-to-be-called-in-play. Mam nadzieję, że znajdę czas, aby stworzyć bardziej wyczerpujące wyjaśnienie. – niels

2

zrobiłem tę samą rzecz przez obsługę przychodzących żądań globalnie w klasie GlobalSettings:

ten opisuje klasę: http://www.playframework.org/documentation/2.0/JavaGlobal

ten opisuje metodę, którą chcesz zastąpić. http://www.playframework.org/documentation/2.0/JavaInterceptors

Oto przykład jak użyłem go w moim projekcie (oczywiście, jest to uproszczona wersja tego, co szukasz):

@Override 
public play.mvc.Action onRequest(play.mvc.Http.Request request, java.lang.reflect.Method method) { 
    if (request.path().startsWith("/secret/locked")) { 
     return new Action.Simple() { 
      @Override 
      public Result call(play.mvc.Http.Context ctx) throws Throwable { 
       return redirect(routes.Application.forbidden()); 
      } 
     }; 
    } 

    return super.onRequest(request, method); 
} 
+0

Czy masz próbkę kodu do Play 2.1/scala? – ripper234

+1

@ ripper234 http: //www.playframework.com/dokumentacja/2.1.0/ScalaInterceptors – ThePizzle

0

To nie jest dobre rozwiązanie do rozszerzenia kontroler podstawowy dla wszystkich kontrolerów i mieć @Before w kontrolerze bazowym.

Można rozszerzyć filtr lub filtr szczelinowy .e.g.

klasa filtr1 rozciąga Filter {}

i stosowania filtr1 do globalnego

Powiązane problemy