переменные во флеш-области не сохраняются в Google Chrome - PullRequest
3 голосов
/ 12 апреля 2011

Когда пользователь пытается получить доступ к странице в контроллерах администрирования (в основном это 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.

Предложения

Ответы [ 2 ]

2 голосов
/ 12 апреля 2011

У меня все получилось:

Убедитесь, что метод checkAccess вызывает метод login с текущим URL:

static void checkAccess() throws Throwable {
    // Authent
    if (!session.contains("username")) {            
        login(request.method.equals("GET") ? request.url : "/");
    }
}

Затем в представлении login.html добавьте скрытое полепараметр, который вы уже передали методу входа:

#{form @authenticate()}
<input type="hidden" name="returnUrl" value="${params.returnUrl}">
...
#{/form}

Или добавьте параметр returnUrl непосредственно в form.action:

#{form @authenticate().add("returnUrl", params.returnUrl)}

Вот и все.И вам не нужен флеш прицел.

1 голос
/ 12 апреля 2011

Я заметил эту строку кода в логине:

 redirectToOriginalURL();

При вызове метода без аргументов, но у показанного вами redirectToOriginalURL есть параметр String. Может быть, это часть проблемы?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...