Страница после входа в систему
В моей игре! приложение, я закодировал контроллеры. Безопасность как
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.index() и, таким образом, к Admin/index.html. так хорошо.
Но когда я нахожусь на странице X и нажимаю на ссылку входа в систему, я ожидаю, что вернусь к pageX.Instead, вызывается метод Application.index(), и меня перенаправляют в Application.index.html. Является ли это ожидаемым поведение? Что мне нужно сделать, чтобы попасть на страницу X после входа в систему?
Обновить:
Я попытался сохранить URL во флэш-памяти, используя @Before в контроллере безопасности
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>
3 ответа
В вашем контроллере, перед вызовом '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
Это будет ожидаемое поведение, поскольку именно так настроена ваша маршрутизация. Нажмите на логин и получите перенаправление на Application.index или Admin.index, если вы администратор.
Если вы хотите получить страницу, по которой вы щелкнули ссылку для входа, вы можете добавить текущее действие в ссылку для входа и после проверки подлинности перенаправить на это действие.
то есть. ссылка для входа в систему: GET /login?action=Application.something -> переводит вас на страницу входа и сохраняет действие как скрытое поле в форме входа. Когда вы аутентифицируете пользователя, вы выполняете действие.
Play уже делает перенаправление на исходный URL, когда вы пытаетесь получить доступ к защищенной странице, когда вы не вошли в систему.
Если вы хотите использовать это повторно, вы можете поместить свой URL во флеш-область в методе "onAuthenticated". В исходном коде воспроизводите вызов "redirectToOriginalURL" сразу после этого, основываясь на значении значения "url".
static void onAuthenticated() {
flash.put("url", "GET".equals(request.method) ? request.url : "/");
}