5

在我的戏里!应用程序,我已将 controllers.Security 编码为

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 并单击登录链接时,会出现登录表单并且我可以登录。如果我以 admin 身份登录,它会将我带到 Admin.index() 并由此进入 Admin/index.html观点。到目前为止一切都很好

但是,当我在 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 中,例如:

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。

如果要检索单击登录链接的页面,可以将当前操作添加到登录链接,并在通过身份验证后重定向到此操作。

IE。登录链接:GET /login?action=Application.something --> 将您带到登录页面,然后将操作保存为登录表单中的隐藏字段。当您对用户进行身份验证时,呈现操作。

于 2011-09-05T05:52:35.437 回答
-2

当您尝试在未登录的情况下访问受保护的页面时,Play 已经重定向到原始 url。

如果你想重用它,你可以将你的 url 放在“onAuthenticated”方法中的 flash 范围内。在源代码中,根据“url”值的值播放调用“redirectToOriginalURL”。

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