2011-01-07 1 views
10

Quando si utilizza @before, viene utilizzato solo in una classe. Come applico un filtro globale in playframework? In questo modo viene utilizzato un filtro per tutte le classi di controller.Come applicare un filtro globale in playframework

+0

Questo è legato alla mia domanda http://stackoverflow.com/questions/4597766/easy-way-to-use-secure- module-or-similar-on-all-controller-in-play. Ho provato a utilizzare un potenziatore bytecode per aggiungere un'annotazione '@ With' a tutti i controller, ma questo mi ha portato a questa domanda: http://stackoverflow.com/questions/4608883/problem-with-classes-not-found-during -playplugin-enhance –

+0

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

risposta

6

Una soluzione semplice consiste nell'estendere un controller di base per tutti i controller e avere il @Before nel controller di base.

L'altra opzione (e la soluzione migliore, in quanto più flessibile) consiste nell'utilizzare l'annotazione @With. L'esempio sulla documentazione gioco è

Esempio:

public class Secure extends Controller { 

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

E su un altro controller:

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

    ... 

} 

Ciò significa il controller di amministrazione elaborerà tutti gli intercettori (@Before, @After, @ Infine) contenuto nel controller Secure.

+2

Sfortunatamente questo richiede ancora di aggiungere l'annotazione '@ Con' a tutti i controller. Soprattutto nel caso del plug-in Sicuro, sarebbe preferibile rendere tutti i controllori sicuri per impostazione predefinita e quindi autorizzare quelli che dovrebbero essere accessibili pubblicamente. Non ho ancora capito come farlo. –

+0

d'accordo, non mi piace la soluzione qui come ogni sviluppatore deve ricordare e il comportamento umano dice che sarà dimenticato a un certo punto. –

1

Per questo problema è sufficiente utilizzare PlayPlugin. Vedi here per maggiori dettagli.

+0

cura di elaborare un po '? –

+0

Scusate, ero di fretta l'ultima volta. Puoi trovare alcune informazioni qui: http://stackoverflow.com/questions/4515627/how-to-get-beforeactioninvocation-and-afteractioninvocation-to-be-called-in-play. Spero di trovare il tempo per creare una spiegazione più completa. – niels

2

ho fatto questa cosa molto gestendo le richieste in entrata a livello mondiale nella classe GlobalSettings:

questo descrive la classe: http://www.playframework.org/documentation/2.0/JavaGlobal

Questo descrive il metodo che ci si vuole ignorare. http://www.playframework.org/documentation/2.0/JavaInterceptors

Ecco un esempio di come l'ho usato nel mio progetto (ovviamente, questa è una versione semplificata di quello che stai cercando):

@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

Hai un esempio di codice per Play 2.1/scala? – ripper234

+1

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

0

Non è una buona soluzione per estendere un controller di base per tutti i controller e avere @Before nel controller di base.

È possibile estendere il filtro o il filtro di essenza .e.g.

classe filtro1 estende Filtro {}

e applicare filtro1 a Global