8

me gustaría requiere que el usuario utilice un de usuario/contraseña al acceder a algunas partes de mi aplicación GAE (Google App Engine). Quiero limitar el acceso al conjunto de usuarios predefinidos, p. en la página, donde se pueden cargar nuevos datos en el almacén de datos.autenticación en Google App Engine (página web)

He encontrado que hay 3 formas en GAE cómo esto se puede solucionar, pero parece sólo el último (el más complicado) podría ser una solución para mi problema:

  1. Utilice un descriptor de despliegue (<security-constraint> en web.xml). Esto no es agradable, ya que esos usuarios tienen acceso, incluso como espectadores de la página de administración de la aplicación GAE, donde pueden ver el historial de facturación, explorar el Almacén de datos, registros, etc., y esto es algo que debo evitar.

  2. Utilice el inicio de sesión federado (Abra ID) (https://developers.google.com/appengine/articles/openid) y permita a los usuarios utilizar su Google, Yahoo! u otras identidades para iniciar sesión. No es una solución, ya que quiero limitar el acceso a un pequeño grupo de usuarios (máximo 5) y no permitir que todos utilicen la aplicación.

  3. La otra opción es crear sencilla página de inicio de sesión encargo accesible sólo a través de HTTPS y dejar que el usuario envíe el nombre de usuario contraseña & en una petición POST (que puede ser liso ya que tenemos Conexión segura https) a una servlet, en el servlet genera un identificador de sesión con la validez especificada y lo hace parte de cada solicitud posterior. También necesita verificar cada vez que el usuario envía una solicitud GET o POST si el identificador de sesión existe y no caduca mientras tanto manualmente.

¿Alguna otra/mejor propuesta sobre cómo mantener cuentas de administrador? ¿Puede HttpSession ayudar con la última variante?

Saludos cordiales, Sten

+1

Estas confinando a dos asuntos completamente independientes aquí, autenticación y autorización. Puede combinar cualquiera de las dos primeras soluciones (autenticación) con su propia solución para verificar la autorización. La forma más fácil de hacerlo sería mantener una lista de usuarios permitidos en el almacén de datos y buscar usuarios cuando inicien sesión para verificar los permisos, como sugieren Peter y Adam a continuación. –

Respuesta

1

que utilizan una combinación de 2 y 3. Permitir que todos los usuarios acceder, pero luego limitar las acciones a las direcciones de correo electrónico en particular. Estos pueden estar codificados o (mejor) en el almacén de datos y la Memcache (para que no tenga que consultar el almacén de datos en cada solicitud). También puede almacenar en caché estos datos en variables estáticas en Java, si así lo desea. Tenga en cuenta que puede necesitar eliminar las instancias manualmente si cambia los usuarios que tienen acceso. Si, como yo, rara vez/nunca cambias de acceso, entonces esto no debería ser un problema.

Permitir que todos los usuarios inicien sesión realmente no les da acceso en mi aplicación; ven las páginas de administración pero están vacías aparte de un mensaje que dice "No tiene acceso a ninguna de estas opciones administrativas".

+0

¿Alguien puede compartir un código de muestra para esto en el lado del Servlet? – Axwack

1

Algunas notas:

  1. yo sepa que su suposición no es correcta. Iniciar sesión en la aplicación no tiene nada que ver con el permiso de las páginas de administración. Necesita agregar explícitamente usuarios a través de la página "Permisos" para que tengan acceso a las páginas de administración.

  2. Aún puede verificar las propiedades del usuario (correo electrónico) después de que el usuario inicie sesión con OpenID y les niegue el acceso.

  3. Esto es por supuesto factible. La forma natural de rastrear usuarios es sessions. Google por ejemplos.

En ambos casos 2. '3. Es aconsejable disponer de un filtro de servlet que comprueba si hay sesión de usuario ha iniciado sesión en y denegar el acceso (retorno 404) si el usuario no está conectado.

1

I sugerir la página de inicio de sesión de Google estándar. Usar algo como esto en que el controlador de autenticación (Marco de Java + Jersey, que por supuesto no es necesario):

@Path("/login") 
public Response login(@Context UriInfo ui) throws Exception { 
    UserService userService = UserServiceFactory.getUserService(); 
    com.google.appengine.api.users.User user = userService.getCurrentUser(); 
    Response response; 
    if (user == null) { 
    URI uri = new URI(userService.createLoginURL(ui.getBaseUri().toString())); 
    response = Response.seeOther(uri).build(); 
    } else { 
    URI uri = new URI("/"); 
    response = Response.seeOther(uri).build(); 
    } 
    return response; 
} 

@GET 
@Path("/logout") 
public Response logout(@Context UriInfo ui) throws Exception { 
    UserService userService = UserServiceFactory.getUserService(); 
    com.google.appengine.api.users.User user = userService.getCurrentUser(); 
    Response response; 
    if (user == null) { 
    URI uri = new URI("/"); 
    response = Response.seeOther(uri).build(); 
    } else { 
    URI uri = new URI(userService.createLogoutURL(ui.getBaseUri().toString())); 
    response = Response.seeOther(uri).build(); 
    } 
    return response; 
} 

El método de inicio de sesión que redirige aplicación a la página de acceso a Google si el usuario está missin (esencialmente no conectado) . El método de cierre de sesión cerrará la sesión del usuario.

Esperanza esto ayuda a la atención

0

atención a la tercera solución: en lugar de pasar nombre de usuario & contraseña de mi webapp pide nombre de usuario & apiSecret (generada automáticamente en el primer inicio de sesión), por lo que puede invalidar (y volver a generar) de forma rápida el apiSecret si algo sale mal.

Hay otra opción: OAuth (https://developers.google.com/appengine/docs/java/oauth/). Aquí está mi fragmento de código (UserAccount es mi clase para representar a un usuario; el usuario es "com.google.appengine.api.users.User", retrieveUser (..) es la función para recuperar mi UserAccount de un "Usuario registrado" "):

public UserAccount getUserLogged(HttpServletRequest request) { 
    try { 
     User loggedUser = oauthService.getCurrentUser(); 
     if(loggedUser!=null) { 
      return super.userAB.retrieveUser(loggedUser); 
     } 
    } catch (OAuthRequestException e) { 
     return null; 
    } 
    return null; 
}