8

GAE (Google App Engine) アプリケーションの一部にアクセスするときに、ユーザーにログイン/パスワードの使用を要求したいと考えています。新しいデータをデータストアにアップロードできるページなど、事前定義された一連のユーザーへのアクセスを制限したいと考えています。

GAE にはこれを解決する方法が 3 つありますが、私の問題を解決できるのは最後の方法 (最も複雑な方法) だけのようです。

  1. <security-constraint>( web.xml 内の)デプロイメント記述子を使用します。これらのユーザーは、GAE アプリケーションの管理ページへのビューアーとしてもアクセスでき、請求履歴を表示したり、データストアやログを参照したりできるため、これは望ましくありません。これは私が避けなければならないことです。

  2. 連携ログイン ( Open ID ) ( https://developers.google.com/appengine/articles/openid ) を使用して、ユーザーが Google、Yahoo! を使用できるようにします。またはログインする他のアイデンティティ。アクセスを少数のユーザー (最大 5 人) に制限し、誰もがアプリケーションを使用できないようにしたいので、これは解決策ではありません。

  3. もう 1 つのオプションは、HTTPS 経由でのみアクセスできるシンプルなカスタム ログイン ページを作成し、ユーザーが POST 要求でユーザー名とパスワードを送信できるようにすることです (安全なhttps接続があるため、単純な場合があります)。サーブレットでセッション識別子を生成します。指定された有効性を持ち、それを後続のすべてのリクエストの一部にします。また、ユーザーが GET または POST 要求を送信するたびに、セッション ID が存在し、その間に有効期限が切れていないかどうかを手動で確認する必要があります。

管理者アカウントを維持する方法に関する他の/より良い提案はありますか? HttpSession最後のバリアントを助けることができますか?

よろしく、 STeN

4

4 に答える 4

2

標準の Google ログイン ページをお勧めします。認証コントローラーで次のようなものを使用します(もちろん必要ではないJava + Jersey Framework):

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

login メソッドは、ユーザーがログインしていない場合 (基本的にログインしていない場合)、アプリを Google ログイン ページにリダイレクトします。logout メソッドは、ユーザーをログアウトします。

お役に立てれば

于 2012-04-11T12:14:27.957 に答える
1

2 と 3 を組み合わせて使用​​します。すべてのユーザーにログインを許可しますが、特定の電子メール アドレスにアクションを制限します。これらはハードコーディングするか、(より良い) データストアと memcache でコーディングすることができます (リクエストごとにデータストアにクエリを実行する必要がないようにするため)。必要に応じて、このデータを Java の静的変数にキャッシュすることもできます。ただし、アクセス権を持つユーザーを変更する場合は、インスタンスを手動で強制終了する必要があることに注意してください。私のように、アクセスをほとんど/まったく変更しない場合、これは問題になりません。

すべてのユーザーにログインを許可すると、実際にはアプリにアクセスできなくなります。管理ページは表示されますが、「これらの管理オプションにはアクセスできません」というメッセージ以外は空です。

于 2012-04-11T08:54:26.473 に答える
1

いくつかのメモ:

  1. 私の知る限り、あなたの仮定は正しくありません。アプリケーションへのログインは、管理ページの権限とは関係ありません。ユーザーが管理ページにアクセスできるようにするには、「アクセス許可」ページからユーザーを明示的に追加する必要があります。

  2. ユーザーが OpenID でログインしてアクセスを拒否した後でも、ユーザー プロパティ (電子メール) を確認できます。

  3. これはもちろん実行可能です。ユーザーを追跡する自然な方法はセッションです。例についてはGoogle。

どちらの場合も 2. ' 3. ユーザーがログインしている場合はセッションをチェックし、ユーザーがログインしていない場合はアクセスを拒否する (404 を返す) サーブレット フィルターを使用することをお勧めします。

于 2012-04-11T09:04:41.957 に答える
-1

3 番目の解決策に注意してください。ユーザー名とパスワードを渡す代わりに、私の webapp はユーザー名と apiSecret (最初のログイン時に自動的に生成されます) を要求します。

別のオプションがあります: OAuth (https://developers.google.com/appengine/docs/java/oauth/)。これが私のコードです (UserAccount はユーザーを表すクラスです。User は「com.google.appengine.api.users.User」です。retrieveUser(..) は、ログに記録された「User」から 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;
}
于 2012-04-11T13:02:48.880 に答える