2013-04-18 3 views
0

У меня есть couchapp, с которым я хочу контролировать доступ к Play! на основе каждого пользователя. Мой план состоит в том, чтобы разместить couchapp на порту xxxx, который доступен только внутренне и хост Play! на порт 80.Play Framework - запрос прокси с аутентификацией сеанса

В Apache я хотел бы сделать это так,

ProxyPass /couchapp http://localhost:xxxx 
ProxyPassReverse /couchapp http://localhost:xxxx 

Но нет никакой аутентификации с этим подходом. Я вижу Play! имеет некоторые функции прокси-сервера, но я не вижу в этом никакой возможности добавить аутентификацию пользователя, http://www.playframework.com/documentation/2.0/HTTPServer

Любая идея, как добавить аутентификацию пользователя в игру! прокси-сервер? Код будет выглядеть примерно так.

// Routes all request to http://localhost:xxxx/ if authenticated 
public static Result useProxy() { 
    if (!session("authorized").equals("true")) { 
     String pingURL = ""; 
     return redirect(pingURL); // will call pingCallback after login 
    } 
    return ok(); // take the original request to /couchapp/xxxx.asset and proxy it to http://localhost:xxxx/xxxx.asset 
} 

public static Result pingCallback() { 
    Form<PingResponse> pingResponseForm = Form.form(PingResponse.class); 
    PingResponse pingResponse = pingResponseForm.bindFromRequest().get(); 
    if (!pingResponse.isAuthorized()) { 
     return unauthorized(); 
    } else { 
     session("authorized", "true"); 
    } 
    return ok(); // take the original request to /couchapp/xxxx.asset and proxy it to http://localhost:xxxx/xxxx.asset 
} 

Спасибо!

ответ

0

Я использовал play.libs.WS сделать прокси-вызовы прагматично. Вот код. В настоящее время сессия теряется при каждом вызове, но это другая проблема.

-Edit - Запуск сеанса происходит из-за того, что fav.ico не имеет cookie, отправленного вместе с ним, и Play полагается на файлы cookie для сеанса. Я добавил чек для этого, но, вероятно, лучше отфильтровать это в файле маршрутов.

package controllers; 

import models.PingResponse; 
import play.data.Form; 
import play.libs.F; 
import play.mvc.Controller; 
import play.mvc.Result; 
import play.libs.WS; 

public class Ping extends Controller { 
    final static String playProxyURL = "http://localhost:9000/"; // pretend this is our proxy domain(should be on port 80) 
    final static String couchAppURL = "http://localhost:80/couchappTest/"; // pretend this is our internal secure site 
    final static String pingURL = "http://localhost:80/pingTest/"; // pretend this is ping endpoint 

    public static Result init() { 
     return Ping.useProxy(""); 
    } 

    public static Result useProxy(String assetPath) { 

     // request for favicon.ico doesn't include cookie :(
     if (assetPath.equals("favicon.ico")) { 
      return ok(); 
     } 
     if (session("authorized") == null || !session("authorized").equals("true")) { 
      System.out.println("not auth"); 
      return redirect(pingURL); 
     } else { 
      return async(
        WS.url(couchAppURL + assetPath).get().map(
          new F.Function<WS.Response, Result>() { 
           public Result apply(WS.Response response) { 
            return ok(response.getBody()).as(response.getHeader("Content-type")); 
           } 
          } 
        ) 
      ); 
     } 
    } 

    public static Result pingCallbackGET(String token, String httpRef) { 
     if (token == null || token.equals("")) { 
      return unauthorized(); 
     } else { 
      System.out.println("auth"); 
      session("authorized", "true"); 
      session("token", token); 
     } 
     return redirect(playProxyURL + httpRef); 
    } 
} 
1

Вы пытались добавить:

-Dhttp.proxyUser=username -Dhttp.proxyPassword=password 
+1

Я обновил вопрос. Я хочу играть! для проверки сеанса, чтобы узнать, вошел ли пользователь в систему. Затем либо направьте пользователя на couchapp, либо попросите пользователя войти в систему. – sissonb

Смежные вопросы