2011-09-05 16 views
5

En mi juego! aplicación, he codificado como el controllers.Securityla página de inicio de sesión después de playframework

class Security extends controllers.Secure.Security { 
... 
    static void onDisconnected() {  
     Application.index(); 
    } 
    static void onAuthenticated() { 
     User user = User.find("byEmail",Security.connected()).first(); 
     if(user.isAdmin()) { 
     Admin.index(); 
     }else { 
      System.out.println("onAuthenticated()::user not admin"); 
    } 
} 

he puesto las rutas como

GET  /admin/?    Admin.index 
*  /admin    module:crud 
GET /     Application.index 

Cuando estoy en una página pageX decir y hacer clic en el enlace de conexión, aparecerá la ventana de acceso y Puedo iniciar sesión. Si inicio sesión como administrador, me lleva al Admin.index() y, por lo tanto, a la vista Admin/index.html. Tan bueno

Pero cuando estoy en la página X, hago clic en el enlace de inicio de sesión, espero volver a pageX.Instead, la Application.index() método se llama y me llevan a la Application.index.ht ml .. ¿Es este el comportamiento esperado? ¿Qué debo hacer para acceder a pageX después de iniciar sesión?

actualización:

He intentado almacenar la dirección URL en flash utilizando el controlador de seguridad en @Before

class Security extends controllers.Secure.Security { 
    @Before 
    static void storeCurrentUrl() { 
     System.out.println("storeCurrentUrl()"); 
     flash.put("url", "GET".equals(request.method) ? request.url : "/"); 
    } 
    static boolean authenticate(String username, String password) { 
    ... 
    } 

    static void onAuthenticated() { 
     ... 
     String url = flash.get("url"); 
     System.out.println("url="+url); 
     if(!user.isAdmin()) { 
     if(url!=null) { 
     System.out.println("url not null"); 
     redirect(url); 
    }else { 
     System.out.println("url null ..go to /"); 
     redirect("/"); 
    } 
     } 
    } 

Cuando me conecto, consigo éstos salida del terminal

url=null 
url null ..go to/
index() 

he puesto los enlaces de inicio de sesión/cierre de sesión en la plantilla main.html que es heredado por todas las demás páginas

<div id="main"> 
    <div class="auth"> 
    <a href="@{Admin.index()}">Go to Admin Area</a><br/><br/> 
    <a href="@{Secure.login()}">Login</a><br/><br/> 
    <a href="@{Secure.logout()}">Log out</a> 
</div> 

Respuesta

7

En ti controlador, antes de llamar 'login()' Escribe la 'url' en flash algo como:

flash.put("url", "GET".equals(request.method) ? request.url : "/"); 

Una vez que haya conseguido el acceso, obtener la 'url' y redirigir.

String url = flash.get("url"); 
redirect(url); //you may redirect to "/" if url is null 
+0

gracias por la reply..however cuando he intentado esto, yo estoy recibiendo el URL como null.It parece que no es @Before executed.I han actualizado el question..Will que eche un vistazo? –

+0

Para llamar al método @Before, debe ser parte del mismo controlador donde se define la acción entrante. Aquí storeCurrentUrl() no está en un controlador donde se define la acción de inicio de sesión().Por lo tanto, storeCurrentUrl() nunca será llamado. – sojin

+1

Su caso va a ser un poco complicado, como Play es sin estado, nunca almacena la url en su página actual (página X) a la que se hará referencia en la próxima solicitud. Una de las maneras podría ser (aunque creo que está un poco fuera de lugar) mantener la URL de la página actual en flash cada vez que se entregue esa página, de modo que estará allí en flash para una redirección en la próxima solicitud (en autenticación fallida). – sojin

0

Este será el comportamiento esperado ya que esta es la forma en que se configura su enrutamiento. Haga clic en iniciar sesión y reciba una redirección a Application.index o Admin.index si es usuario administrador.

Si desea recuperar la página que ha hecho clic en el enlace de conexión de usted podría añadir la acción actual para el enlace de conexión y una vez autenticado redirigir a esta acción.

es decir. enlace de inicio de sesión: GET /login?action=Application.something -> lo lleva a la página de inicio de sesión luego guarde la acción como un campo oculto en su formulario de inicio de sesión. Cuando autenticas al usuario renderiza la acción.

-2

Juego ya no redirección a la URL original cuando se intenta acceder a una página protegida, mientras no se haya identificado.

Si desea volver a utilizar esto, que ca pone su URL en el alcance del flash en el método "onAuthenticated". En el código fuente, ejecute la llamada "redirectToOriginalURL" justo después de eso en función del valor del valor "url".

static void onAuthenticated() { 
    flash.put("url", "GET".equals(request.method) ? request.url : "/"); 
} 
+2

para cuando llegue a Autenticado(), request.url se iniciará sesión() forma acción :) – sojin

Cuestiones relacionadas