2012-04-09 13 views
1

Ich benutze Feder MVC, und ich habe ein benutzerdefiniertes Authentifizierungs-/Sicherheitssystem, das ich bauen musste.Wie kann sichergestellt werden, dass der Benutzer auf der Controller-Ebene im System angemeldet ist?

NOTE: I know of spring security, but my requirements were to do this in a custom way so please not looking for suggestions about using spring's security modules. 

Wenn sich der Benutzer beim System anmeldet, wird ein Sitzungscookie erstellt. Wenn der Benutzer eine Seite besucht, sucht ein Interceptor nach dem Vorhandensein dieses Cookies und sucht in mysql nach der Sitzungs-GUID. Falls vorhanden, lädt er einige Daten und speichert sie in den Attributen der Anfrage.

Jetzt für Seiten, auf denen der Benutzer angemeldet sein muss, wie kann ich den Zugriff auf der Controller-Ebene beschränken?

Ich tue dies in einem Interceptor könnte:

if url.contains("projects/") ... 

Wenn ich nur Zugriff auf Benutzer im ProjectController angemeldet einschränken wollen, aber das ist nicht wirklich etwas, was ich tun möchte.

Aber ich suche nach einer Annotation, die ich auf der Controller-Ebene hinzufügen könnte, oder vielleicht irgendwie einen BaseController erstellen, den alle Controller erben, die einen angemeldeten Benutzer benötigen.

Was sind meine Optionen für so etwas?

In ASP.NET, habe ich eine Base, und der Controller einen Ereigniszyklus hat, und in dem vor-Aktion gefeuert Ereignisse überprüfte ich, wenn der Benutzer sehen angemeldet wurde.

Also für Anregungen suchen Federmvc?

aktualisiert

Zum Beispiel in ASP.NET Sie 2 Methoden, 1, die kurz vor der Steuerung Aktionsmethode und einem Feuer, das Feuer nach:

Controller.OnActionExecuting 
Controller.OnActionExecuted 

http://msdn.microsoft.com/en-us/library/system.web.mvc.controller.onactionexecuting.aspx

So in der OnActionExecuting kann ich tatsächlich genau sehen, welcher Controller ich bin, und welche Aktion wird auf eine programmatische Weise aufgerufen werden, nicht durch Blick auf th e Anfrage-URL und vergleicht dann tun Zeichenfolge, um zu sehen, ob es eine bestimmte Controller usw.

So in diesem Fall kann ich einfach für Dinge in Cookies oder in meiner Anfrage überprüfen Attribute usw.

Dies ist ein viel stabileren Weg, hat Frühling etwas ähnliches?

+0

Werfen Sie einen Blick auf Spring AOP, es bietet die gleiche Funktionalität wie von 'Controller.OnActionExecuting' und' Controller.OnActionExecuted' mit 'Before' und' Afer' Advices. – Logan

Antwort

2

Wenn Sie dies auf Controller-Ebene benötigen, könnten Sie:

1) deklarieren einen java.security.Principal Parameter in der Steuerung Methodensignatur , der die Feder mit einem Principal Objekt oder

2) Umsetzung ein PermissionEvaluator, die auf einer Controller-Methode aufgerufen werden können, unter Verwendung der Annotations @PreAuthorize ausfüllen, und welche hätte Zugang zu einem Authentication Objekt.

0

Ähnlich wie bei ASP.NET können Sie die Vorteile OncePerRequestFilter nutzen und sie zu der Filterkette verketten, die Sie in web.xml oder Spring Application Context haben. Der Vorteil dieses Filters ist, dass er unabhängig vom MVC-Ansatz ist und keinen "Basis-Controller" benötigt.

Wenn Sie das Spring-Sicherheitsmodul ebenfalls verwenden, können Sie eine custom filter-Konfiguration verwenden und sie in the correct place, it should be, platzieren.

Wenn die Überprüfung fehlschlägt, möchten Sie wahrscheinlich Ausnahmen auslösen oder Benutzer zur richtigen Navigation umleiten.

am letzten Kommentar basiert, können Sie auch mapped interceptors verwenden:

<mvc:interceptors> 
    <mvc:interceptor> 
     <mapping path="/myFirstPath/*"/> 
     <mapping path="/mySecondPath/*"/> 
     <bean class="org.example.SomeInteceptor" /> 
    </mvc:interceptor> 
    <mvc:interceptor>another one</mvc:interceptor> 
</mvc:interceptors> 
+0

Danke, es scheint, der OncePerRequestFilter ist die gleiche Sache wie ein Interzeptor nein? Ich sehe keinen Unterschied? – Blankman

+0

Wie auch in der Frühjahrsdokumentation vorgeschlagen, bietet ein Interceptor eine feinkörnigere Kontrolle als ein Filter. Ursprünglich wird ein Filter über 'web.xml 'konfiguriert, jedoch werden Interzeptoren über den Anwendungskontext konfiguriert, wodurch sie konfigurierbarer werden. In einem allgemeinen Fall können Interzeptoren Filter überwinden. Denken Sie immer noch, dass in Ihrem Fall kombiniert mit benutzerdefinierten Filtern im Frühjahr Sicherheit könnte auch eine Wahl sein. – nobeh

+0

in beiden Fällen, es sagt mir nicht, welcher Controller wird auf präzise Weise feuern, muss ich irgendwie raten, meine Blick auf die URL-Struktur, die zu hacky für mich ist. – Blankman

Verwandte Themen