2010-12-29 9 views
3

Ich entwickle gerade eine GWT 2.1-Anwendung, die in Google App Engine bereitgestellt werden soll. Ich möchte die Serverkommunikation mit der neuen RequestFactory realisieren.Wie können Sicherheitseinschränkungen mit der RequestFactory von GWT 2.1 gehandhabt werden?

Jetzt ist meine Frage, wie in diesem Zusammenhang mit feinkörnigen Sicherheitsproblemen umzugehen? Einige Server-Aktionen (die in den RequestContext-Stubs deklariert sind) müssen auf bestimmte Benutzer beschränkt sein (möglicherweise abhängig von den Parametern des Remote-Aufrufs). Wenn ein Anruf nicht autorisiert ist, möchte ich, dass der Client eine Anmeldeseite anzeigt (damit Sie sich beispielsweise als anderer Benutzer anmelden können).

Aus dem Ausgabenbeispiel kann ich eine automatische Umleitung auf eine Anmeldeseite implementieren, aber in diesem Beispiel ist das Sicherheitsmodell ziemlich einfach: Ein Client darf nur dann auf das Servlet zugreifen, wenn ein Benutzer angemeldet ist in.

Soll ich eine benutzerdefinierte UnAuthorizedException in meinem serverseitigen Dienst auslösen? Wo soll ich diese Ausnahme abfangen? (Kann ich dies in einem Servlet-Filter wie dem GaeAuthFilter des Ausgabenbeispiels tun?)

Antwort

5

Ich suchte auch nach einer Lösung für dieses und kam auf das folgende hinaus. Es behandelt nicht vollständig den Aspekt der Benutzerschnittstelle von Dingen (d. H. Umleitung auf die Anmeldeseite), aber es schützt Ihre Datenschicht vor unberechtigtem Zugriff.

public class MyRequestFactoryServlet extends RequestFactoryServlet 
{ 
    @Override 
    protected void doPost(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException 
    { 
     if (! userIsLoggedIn(req)) 
     { 
      throw new ServletException("not logged in"); 
     } 
     else 
     { 
      super.doPost(req, res); 
     } 
    } 

    @Override 
    protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException 
    { 
     if (! userIsLoggedIn(req)) 
     { 
      throw new ServletException("not logged in"); 
     } 
     else 
     { 
      super.doGet(req, res); 
     } 
    } 

    protected boolean userIsLoggedIn(HttpServletRequest req) 
    { 
     // insert your custom code here for checking session for valid login token 
     User user = (User) req.getSession().getAttribute("LOGGED_IN_USER"); 
     return user != null && user.isEnabled(); 
    } 

Dann nutzen Sie MyRequestFactoryServlet in Ihrem web.xml statt RequestFactoryServlet.

Um den UI-Aspekt der Anmeldung zu behandeln, überprüfe ich die Zielseite meiner App auf gültige Anmeldung mit GWT RPC; Wenn der Benutzer nicht angemeldet ist, werden Sie aufgefordert, einen Benutzernamen/ein Passwort einzugeben. Der obige Code schützt das Back-End vor Benutzern, die versuchen, die Anmeldeseite zu umgehen, indem sie direkt zu anderen URLs springen oder indem sie manuell Daten an das Servlet senden.

+0

Danke für die Antwort. Ich frage mich, wie dies implementiert werden würde, wenn Sie die gleiche RF für Android verwenden? Ich benutze die gleichen Requestfactories und Objekte unter Android und ich bin mir nicht sicher, wie man die Sitzungsattribute setzt. Hast du damit umgegangen? – Patrick

Verwandte Themen