Когда пользователь пытается получить доступ к странице в контроллерах администрирования (в основном это CRUD), он перенаправляется на страницу входа. И, если учетные данные верны и он действительно является администратором, он начинает перенаправляться на страницу, к которой он хотел получить доступ в предыдущем запросе.
Всякий раз, когда кто-то пытается получить доступ к запрещенной странице, он перенаправляется на следующий контроллер:
public static void login(String returnUrl) throws Throwable {
Http.Cookie remember = request.cookies.get("rememberme");
flash.put("url",returnUrl);
if (remember != null && remember.value.indexOf("-") > 0) {
String sign = remember.value.substring(0, remember.value.indexOf("-"));
String username = remember.value.substring(remember.value.indexOf("-") + 1);
if (Crypto.sign(username).equals(sign)) {
session.put("username", username);
redirectToOriginalURL(returnUrl);
}
}
flash.keep();
render();
}
который выполняет метод authenticte (...):
public static void authenticate(@Required String username, String password, boolean remember, String returnUrl) throws Throwable {
// Check tokens
Boolean allowed = false;
// This is the official method name
allowed = (Boolean) Security.invoke("authenticate", username, password);
if (validation.hasErrors() || !allowed) {
flash.keep("url");
flash.error("secure.error");
params.flash();
login(returnUrl);
}
// Mark user as connected
session.put("username", username);
// Remember if needed
if (remember) {
response.setCookie("rememberme", Crypto.sign(username) + "-" + username, "30d");
}
// Redirect to the original URL (or /)
flash.keep("url");
redirectToOriginalURL(returnUrl);
}
Обратите внимание на String returnUrl
в списке параметров. Этот контроллер всегда вызывается в представлении со значением response.url
.
redirectToOriginalURL () - это метод, который получает returnUrl в параметре или во флеш-области.
static void redirectToOriginalURL(String returnUrl) throws Throwable {
if(returnUrl==null) returnUrl = flash.get("url");
if (returnUrl == null) {
returnUrl = "/";
}
redirect(returnUrl);
}
Это прекрасно работает в Firefox и Internet Explorer. Но когда я пытаюсь выполнить это в Google Chrome, returnUrl равен null
. Это известная проблема или я делаю что-то ужасно неправильное?
Никаких особых запросов или чего-либо еще. URL при перенаправлении с недоступной страницы (localhost:9000/admin
) составляет http://localhost:9000/account?returnUrl=%2Fadmin
. Так что ничего плохого нет ...
Следовательно, ошибка должна быть связана с контроллером проверки подлинности, который, по-видимому, не может передать аргументы методу redirectToOriginalURL. Но опять же только в Google Chrome.
Предложения