0

ユーザーがアクションを実行するたびに、ユーザーが1)ログインしているかどうか、2)管理者であるかどうかを確認したいGoogle App Engineプロジェクトを実行しています。これは私がappuserのために持っているコードです:

class AppUser 
{
    private UserService userService;
    private User user;

    public AppUser()
    {
        userService = UserServiceFactory.getUserService();
        user = userService.getCurrentUser();
    }

    public IsAdministrator()
    {
        if(IsLoggedIn())
        {
            return userService.IsUserAdmin();
        }
        return false;
    }

    public IsLoggedIn()
    {
        return user == null;
    }
}

アプリでログアウトすると、これは正常に機能します。ただし、別のページ (Google カレンダーなど) でログアウトしても、アプリはログインしていると認識します。ユーザーがまだログインしているかどうかを確認する別の方法はありますか?

また、これは web.xml の security-constraint で実行できることも知っていますが、ユーザーがログオフした場合に特定のアクションを実行する必要があるため、この場合は機能しません。

App Engine SDK 1.7 と GWT SDK 2.4 を使用しています

4

2 に答える 2

1

今日、私はこれに遭遇しましたが、それはさらに悪いことでした: ユーザー A として (Google サイトのページから) ログアウトし、ユーザー B としてログインしましたが、私の GAE アプリはまだユーザー A としてログインしていると認識していました。

これは、2 つの Cookie が関係しているためです。1 つはどの Google ユーザーが Google にログインしているかを追跡するためのもので、もう 1 つはどの GAE アプリケーション ユーザーが私の GAE アプリケーションにログインしているかを追跡するためのものです。GAE は、Google だけでなく、任意のフェデレーション認証サービスを使用できることを思い出してください。私のアプリケーションは google.com Cookie にアクセスできないため、ユーザー A がまだログインしているかどうか (または現在ログインしているユーザー) を直接確認することはできません。

残念ながら、単純な「フェデレーション ログアウト」メカニズムはまだ見つかっていませんが、Google Identity Toolkitを使用して、予想されるユーザーがログインしていないことを検出できる可能性があります。

この問題について話し合っている他の人を見つけました:

アップデート

私は自分のアプリケーションで機能するソリューションを思いつきました。そこでは、ユーザー (学生) を自分の教室のホームページにリダイレクトするページがあります。1 人の生徒がこれにアクセスする頻度は低い (1 日に数回) ため、どの生徒がログインしているかを知る必要があるため、次の方法を採用しました。

  1. ユーザーはページ A に移動し、ACSID および SACSID Cookie が消去され、ユーザーがログインするために Google にリダイレクトされます。
  2. ユーザーはおそらくすでにログインしているため、Google は (いくつかのリダイレクトを使用して) ACSID および SACSID Cookie を現在ログインしているユーザーに更新し、ページ B のアプリケーションにリダイレクトします。
  3. ページ B は最終的に、ログインしているユーザーに代わってアクションを実行し、正しいユーザーがログインしていることを「確信」します (ページが確信している範囲で)。;-)

アプローチのコード スケッチを次に示します。

# My BaseHandler has a clear_cookie
class LoginAndRedirectHandler(base_handler.BaseHandler):
  def get(self):
    self.clear_cookie('ACSID')
    self.clear_cookie('SACSID')
    self.clear_cookie('dev_appserver_login')

    if 'continue' in self.request.params and \
       self.request.params['continue'].startswith('/'):
      url = self.request.params['continue']
    else:
      # Whatever your page is that needs an up to date logged in user
      url = users.create_login_url('/PageB')

    if isinstance(url, unicode):
      url = url.encode('utf8')
    logging.info('Redirecting to ' + url)
    self.redirect(url)
    return

上記であまり言及しなかった理由は、このプロセスには時間がかかり、少なくとも 4 ~ 5 回のリダイレクトが必要になるためです。

于 2012-09-03T15:42:38.870 に答える
1

ユーザーのログアウトについてアプリに通知する 2 つの方法:

  1. 同期 - サーバーはログアウトについてクライアント (ブラウザ) にアクティブに通知します。Channels APIを使用して、プッシュ通知をクライアントに送信します。GWT ラッパーがあります。

  2. 非同期 - クライアントがサーバーと通信するとき、つまりすべての RPC 呼び出しで認証チェックを追加するときに、サーバーはクライアントにログアウトについて通知します。ユーザー ID がログアウトした場合、GWT で処理できる例外を発生させます。

于 2012-08-17T19:49:53.410 に答える