5

私のプレーで!アプリ、コントローラーをコーディングしました。セキュリティを次のように

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");
   }
}

ルートを次のように設定しました

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

pageX というページでログイン リンクをクリックすると、ログイン フォームが表示され、ログインできます。ビュー。これまでのところとても良い

しかし、pageX でログイン リンクをクリックすると、pageX に戻ることを期待します。代わりに、Application.index() メソッドが呼び出され、Application.index.html に移動します。行動?ログイン後に pageX にアクセスするにはどうすればよいですか?

アップデート:

セキュリティコントローラーの@Beforeを使用して、URLをフラッシュに保存しようとしました

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("/");
    }
      }
   }

ログインすると、これらの端末出力が表示されます

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

他のすべてのページに継承されるmain.htmlテンプレートにログイン/ログアウトリンクを配置しました

<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>
4

3 に答える 3

7

コントローラーで、「login()」を呼び出す前に、次のように「url」をフラッシュに入れます。

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

ログインに成功したら、「url」を取得してリダイレクトします。

String url = flash.get("url");
redirect(url); //you may redirect to "/" if url is null
于 2011-09-05T05:50:54.463 に答える
0

これは、ルーティングが設定されている方法であるため、予期される動作になります。ログインをクリックすると、管理者ユーザーの場合は Application.index または Admin.index にリダイレクトされます。

ログイン リンクをクリックしたページを取得する場合は、現在のアクションをログイン リンクに追加し、認証後にこのアクションにリダイレクトすることができます。

すなわち。ログイン リンク: GET /login?action=Application.something --> ログイン ページに移動し、アクションをログイン フォームの非表示フィールドとして保存します。ユーザーを認証すると、アクションがレンダリングされます。

于 2011-09-05T05:52:35.437 に答える
-2

ログインしていないときに保護されたページにアクセスしようとすると、Play は既に元の URL にリダイレクトします。

これを再利用したい場合は、「onAuthenticated」メソッドのフラッシュ スコープに URL を配置できます。ソース コードでは、「url」値の値に基づいて、その直後に「redirectToOriginalURL」を呼び出します。

static void onAuthenticated() {
    flash.put("url", "GET".equals(request.method) ? request.url : "/");
}
于 2011-09-05T09:55:01.633 に答える