播放框架1.2.5 - 安全重定向问题:请求两次?

时间:2014-07-14 09:40:40

标签: playframework-1.x

我在项目中添加了Secure模块..
我进行了调查,发现安全模块在登录成功后总是重定向到url =“/”

示例,在安全类

public class Secure extends Controller {
@Before(unless={"login", "authenticate", "logout"})
 static void checkAccess() throws Throwable {
 // ... default code
 // ---------------------------checkpoint (2)
}

static void redirectToOriginalURL() throws Throwable {
        Security.invoke("onAuthenticated");
        String url = flash.get("url");
        if(url == null) {
            url = Play.ctxPath + "/";
        }
        System.out.println("DEBUG: redirectToOriginalURL() " + url);
        redirect("/weekPlan"); // ----------------------- (1)
    }
}

调试顺序

  1. 登录成功后,首先运行redirectToOriginalURL(),然后重定向到“/ weekPlan”

  2. checkAccess()run,request.path =“/ weekPlan”

  3. 一切正常,但不会重定向到“/ weekPlan”

  4. checkAccess()再次运行,并且request.path =“/”????

  5. 我不知道他们为什么会跑两次,第二次,request.path =“/”?

    非常感谢, 榄

1 个答案:

答案 0 :(得分:4)

第二次,url将为空,因为flash上下文被清除,除非明确告知that is it's default behavior,否则它不会为多个后续请求保留其值。

它击中checkAccess两次的原因不在您发布的代码范围内,因此我无法对此发表评论。我可以说你正在混淆这个流程。使用默认安全代码发生事件的顺序如下:

  1. 网址请求,checkAccess被解雇。
  2. checkAccess通过重定向到登录页面拒绝访问,将当前请求网址放在闪存范围内。
  3. loginauthenticate执行他们的操作(实际登录),然后在authenticate结束时调用redirectToOriginalURL
  4. redirectToOriginalURL向浏览器发送重定向,浏览器发出请求。
  5. 网址请求,checkAccess被解雇。
  6. checkAccess确认这次我们已经过身份验证,因此不采取任何操作,允许控制器方法开始执行其操作并返回正常结果。
  7. 因此,您的问题中的步骤3和4不可能是安全模型故障(至少使用默认代码)。您必须检查其余代码以找到此行为的来源。