OAuth Clientモジュールに付属しているサンプル
Play! frameworkのOAuth Clientモジュールに付属しているサンプルを動かしてみたのですが、いくつか問題点がありました。
問題点
Userテーブルにレコードが保存されない
ApplicationコントローラのgetUserアクションで、UserモデルのfindOrCreateメソッドが呼ばれていますが、実際このメソッド内でユーザが見つからなかった時はUsersモデルのインスタンスを作成しているだけで、データベースにレコードは作成されません。
UsersテーブルとCredentialsテーブルに関連付けが無い
一対一あるいは一対多の関連づけに関するアノテーションがUsersおよびCredentialsモデルにありません。したがって、例えばユーザ名(username)からCredentialsを取ってくることができません。
解決方法
方法は複数ありますが、私はモジュールを修正しないで済むやり方を選択しました。
- UsersモデルにCredentialsモデルのフィールドを追加。
- Credentialsモデルの各メソッドをUserモデルにコピーし、ICredentialsインターフェースを実装。
ただし、conf/application.confでjpa.ddlがnone以外の場合、データベースにCredentialsテーブルが作成されますので、その場合は後からこのテーブルを削除しました。
package models; import play.db.jpa.*; import javax.persistence.*; import play.modules.oauthclient.ICredentials; @Entity public class Users extends Model implements ICredentials { public String username; private String token; private String secret; public Users(String username) { this.username = username; save(); } public static Users findOrCreate(String username) { Users user = Users.find("username", username).first(); if (user == null) { user = new Users(username); } return user; } public void setToken(String token) { this.token = token; save(); } public String getToken() { return token; } public void setSecret(String secret) { this.secret = secret; save(); } public String getSecret() { return secret; } }