Добавление капчи на страницу входа в PlayFramework 1.2.x

У меня есть задача поддерживать небольшое приложение, написанное с помощью PlayFramework 1.2.x. Один пункт, который необходимо сделать: добавить капчу на страницу входа. Это, по-видимому, сложнее, чем кажется, поскольку страница входа в систему обрабатывается модулем Secure полуавтоматически.

При обработке обычной HTTP-формы PlayFramework передает переменные формы в метод контроллера в качестве параметров. При использовании стандартного безопасного модуля форма входа содержит только имя пользователя и пароль, и они передаются методу аутентификации.

Теперь я могу создать пользовательскую форму входа в систему, включающую капчу, и мне также разрешено переопределять метод аутентификации в модуле «Безопасность». Проблема в следующем: я не могу изменить параметры метода аутентификации, чтобы включить код проверки, иначе он больше не переопределяет метод в суперклассе (и тогда метод никогда не вызывается).

Вот простая форма входа с капчей, адаптированной из примера «yabe»:

#{extends 'main.html' /} #{set title:'Login' /}

#{form @authenticate()}

<p>
    <label for="username">User name: </label> <input type="text"
        name="username" id="username" maxlength="30"
        value="${params.username}" />
</p>
<p>
    <label for="password">Password: </label> <input type="password"
        name="password" id="password" maxlength="30" " />
</p>
<p>
    <label for="code">Please type the code below: </label> <img
        src="@{Captcha.captcha(randomID)}" /> <br /> <input type="text"
        name="code" id="code" size="18" value="" /> <input type="hidden"
        name="randomID" value="${randomID}" />
</p>
<p>
    <input type="submit" id="signin" value="Log in" />
</p>

#{/form}

Вот простой метод аутентификации, который не работает, потому что "код" и "randomID" не определены. Опять же, я не могу просто добавить параметры для аутентификации, иначе он больше не переопределяет метод из суперкласса и не вызывается.

package controllers;

import play.cache.Cache;
import play.data.validation.Required;
import models.*;

public class Security extends Secure.Security {


    static boolean authenticate(String username, String password) {
        boolean auth = false;
        if (code.equals(Cache.get(randomID))) {
            auth = (User.connect(username, password) != null);
        }
        return auth;
    }
}

Вопрос: как я могу получить значения "code" и "randomID" из формы в метод аутентификации? Есть ли другой способ доступа к значениям из формы?


person Brad Richards    schedule 18.07.2012    source источник


Ответы (1)


Вы находитесь в игре! контроллер, поэтому у вас есть доступ к объекту request.params, из которого вы можете получить параметры, как в request.params.get("code").

person Samuel    schedule 18.07.2012