この記事はPlayFramework(Java) Advent Calendar 2016の記事です。
PlayFrameworkにはCSRF対策のアノテーションは存在しますが、
CSRF以外にも対応出来るようにしていきたいと思います。
そこで、二重サブミットに関してはとても参考になるのがさいきょうの二重サブミット対策です。
この記事の中のトークンによるチェックの方式をPlayFrameworkでどのように実装するか書いていきます!!
トークンの生成
トークンの要件は色々あると思いますが、今回は英数字の32文字のトークンを生成します。
public static String setToken(){
String token = RandomStringUtils.randomAlphanumeric(32);
Cache.set("token", token);
return token;
}
Javaある乱数を生成してくれるクラスを用いて、生成したトークンをCacheに格納します!!
トークンのチェック
生成したトークンはクライアント側でhidden属性で持たせといて、
サブミットした時に、Cacheに格納したトークンと確認をします。
public static Boolean isToken(String clientToken) {
Boolean isToken = true;
String cacheToken = (String) Cache.get("token");
if (cacheToken == null || "".equals(cacheToken)) {
isToken = false;
} else {
if (!cacheToken.equals(clientToken)) {
isToken = false;
}
}
Cache.remove("token");
return isToken;
}
クライアントから返ってきたトークンと一致していればtrueを返して、
一致していなければfalseを返します。
これで、二重サブミットに対応出来ます!!