0

私は PlayFramework 1.2.x で書かれた小さなアプリケーションを保守する仕事をしています。実行する必要がある項目の 1 つは、ログイン ページにキャプチャを追加することです。ログインページは Secure モジュールによって半自動的に処理されるため、これは明らかに人が考えるよりも難しいことです。

通常の HTTP フォームを処理する場合、PlayFramework はフォーム変数をパラメーターとしてコントローラー メソッドに渡します。標準のセキュア モジュールを使用すると、ログイン フォームにはユーザー名とパスワードのみが含まれ、これらは認証メソッドに渡されます。

これで、キャプチャを含むカスタム ログイン フォームを作成できるようになりました。また、Secure モジュールで認証方法をオーバーライドすることもできます。問題は次のとおりです。認証メソッドのパラメーターを変更してキャプチャコードを含めることができないか、スーパークラスのメソッドをオーバーライドしなくなりました (メソッドは呼び出されません)。

以下は、「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}

「code」と「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" の値を取得するにはどうすればよいですか? フォームから値にアクセスする他の方法はありますか?

4

1 に答える 1