8

我想要求用户在访问我的GAE(Google App Engine)应用程序的某些部分时,使用登录名/密码来使用。我想限制对一组预定义用户的访问,例如,在页面上可以将新数据上传到数据存储区。Google App Engine上的身份验证(网页)

我发现有在GAE 3种方式如何可以解决的,但它看起来像只有最后一个(最复杂),可能是我的问题的解决方案:

  1. 使用部署描述符(<security-constraint> in web.xml)。这并不好,因为这些用户有权访问GAE应用程序的管理页面,他们可以在其中查看帐单历史记录,浏览数据存储区,日志等,这是我必须避免的。

  2. 使用联合登录(打开ID)(https://developers.google.com/appengine/articles/openid)并允许用户使用他们的Google,Yahoo!或其他身份登录。这不是一个解决方案,因为我想限制访问一小部分用户(最多5个),并且不允许每个人都使用该应用程序。

  3. 另一种选择是只通过HTTPS创建简单自定义登录页面访问,让用户在POST请求发送用户名&密码(也可以是普通的,因为我们有安全HTTPS连接)至servlet在servlet上生成一些具有指定有效性的会话标识符,并使其成为每个后续请求的一部分。如果会话标识符存在且每次用户发送GET或POST请求时都需要检查并且不会手动过期。

关于如何维护管理员帐户的任何其他/更好的建议? HttpSession可以帮助最后一个变体?

亲切的问候, 斯登

+1

你在这里混淆了两个完全不同的问题,认证和授权。您可以将前两种解决方案(身份验证)中的任意一种与您自己的解决方案进行组合以检查授权。最简单的方法是维护数据存储中允许用户的列表,并在用户登录时查找用户权限,如Peter和Adam在下面所示。 – 2012-04-12 00:16:13

回答

1

我用的是2和3。我允许所有用户登录组合,但后来我限制行动,以特定的电子邮件地址。这些可以在数据存储和memcache中进行硬编码或(更好)(这样您就不必在每个请求上查询数据存储)。如果你愿意,你也可以用Java中的静态变量来缓存这些数据 - 只要知道,如果你改变了有权访问的用户,你可能需要手动关闭实例。如果像我一样,你很少/永远不会改变访问,那么这应该不成问题。

允许所有用户登录真的让他们在我的应用程序中无法访问 - 他们看到管理页面,但除了显示“您无权访问任何这些管理选项”消息外,它们为空。

+0

任何人都可以在Servlet端共享一些示例代码吗? – Axwack 2015-05-19 22:56:14

1

一些注意事项:

  1. 据我所知你的假设是不正确的。登录到应用程序与管理页面权限无关。您需要通过“权限”页面明确添加用户才能访问管理页面。

  2. 用户使用OpenID登录并拒绝访问,您仍然可以检查用户属性(电子邮件)。

  3. 这当然是可行的。跟踪用户的自然方式是sessions。谷歌的例子。

在这两种情况下2.“3.它最好有一个Servlet过滤器,如果有用户登录,检查会议,并拒绝访问(返回404),如果用户没有登录。

1

我建议标准的Google登录页面。使用这样的事情在你认证控制器(Java + Jersey框架这当然是没有必要):

@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; 
} 

的登录方法重定向你的应用程序的谷歌登录页面,如果用户想念(基本上没有登录) 。注销方法将注销用户。

希望这有助于

0

注重第三解决方案:强似用户名&密码我的web应用程序会询问用户名& apiSecret(在第一次登录时自动生成),这样你就可以无效(和重新生成)迅速apiSecret如果出现问题。

还有另一种选择:OAuth(https://developers.google.com/appengine/docs/java/oauth/)。 这是我的一段代码(UserAccount是我的类代表一个用户;用户是“com.google.appengine.api.users.User”,retrieveUser(..)是从记录的用户中检索我的UserAccount的函数“):

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; 
} 
相关问题