我在项目中添加了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)
}
}
调试顺序
登录成功后,首先运行redirectToOriginalURL(),然后重定向到“/ weekPlan”
checkAccess()run,request.path =“/ weekPlan”
一切正常,但不会重定向到“/ weekPlan”
checkAccess()再次运行,并且request.path =“/”????
我不知道他们为什么会跑两次,第二次,request.path =“/”?
非常感谢, 榄
答案 0 :(得分:4)
第二次,url
将为空,因为flash
上下文被清除,除非明确告知that is it's default behavior,否则它不会为多个后续请求保留其值。
它击中checkAccess
两次的原因不在您发布的代码范围内,因此我无法对此发表评论。我可以说你正在混淆这个流程。使用默认安全代码发生事件的顺序如下:
checkAccess
被解雇。checkAccess
通过重定向到登录页面拒绝访问,将当前请求网址放在闪存范围内。login
和authenticate
执行他们的操作(实际登录),然后在authenticate
结束时调用redirectToOriginalURL
。redirectToOriginalURL
向浏览器发送重定向,浏览器发出请求。checkAccess
被解雇。checkAccess
确认这次我们已经过身份验证,因此不采取任何操作,允许控制器方法开始执行其操作并返回正常结果。因此,您的问题中的步骤3和4不可能是安全模型故障(至少使用默认代码)。您必须检查其余代码以找到此行为的来源。