Google App Engine 第十二回
- 2016年03月02日
- CATEGORY- 1. 技術力{技術情報}
Slim3とは
Slim3とはGoogle App Engine/Javaに最適化されたフルスタックMVCフレームワークです。
Slim3を使ったページの作成方法6
今回はGoogleアカウントのユーザ認証を利用し、各ユーザ毎にMemoの管理を行う実装をご紹介します。
特記事項
今回からソースコードは前回からの変更点のみを記載します。(diffを使用)
ソースコード全体に関してはGitHubを参照してください。
URL: https://github.com/Sin330/slim3_test/tree/2016-01
今回使用したGoogleアカウント取得用クラス
ServletまたはJSP内から呼び出すことで、Googleアカウントが取得できます。
// 1. UserServiceFactoryからUserServiceを取得 // https://cloud.google.com/appengine/docs/java/javadoc/com/google/appengine/api/users/UserServiceFactory // https://cloud.google.com/appengine/docs/java/javadoc/com/google/appengine/api/users/UserService UserService userService = UserServiceFactory.getUserService(); // 2. UserServiceからUserを取得 // https://cloud.google.com/appengine/docs/java/javadoc/com/google/appengine/api/users/User User user = userService.getCurrentUser();
Memo modelの変更
1. Memo modelにクラス変数userIdを追加する。
2. Memo modelにuserIdのgetter/setterを追加する。
diff --git a/src/biz/e_zero/slim3_test/model/Memo.java b/src/biz/e_zero/slim3_test/model/Memo.java index 0385459..6c5f1d6 100644 --- a/src/biz/e_zero/slim3_tes t/model/Memo.java +++ b/src/biz/e_zero/slim3_test/model/Memo.java @@ -24,6 +24,10 @@ public class Memo implements Serializable, Slim3Model { private String memo; private Date updateDate; + // userIdの追加(P6) + @Attribute(unindexed = false) + private String userId; + public String getTitle() { return title; } @@ -90,6 +94,15 @@ public class Memo implements Serializable, Slim3Model { this.version = version; } + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + @Override public int hashCode() { final int prime = 31;
MemoServiceの変更
1. 新規メソッドの作成
– MemoService#getUserId()
2. 各メソッドにuserId関連の処理を追加する。
– MemoService#list()
– MemoService#insert()
– MemoService#update()
diff --git a/src/biz/e_zero/slim3_test/service/MemoService.java b/src/biz/e_zero/slim3_test/service/MemoService.java index 37b746d..c311c31 100644 --- a/src/biz/e_zero/slim3_test/service/MemoService.java +++ b/src/biz/e_zero/slim3_test/service/MemoService.java @@ -5,6 +5,7 @@ import java.util.List; import org.slim3.datastore.Datastore; import com.google.appengine.api.datastore.Key; +import com.google.appengine.api.users.UserServiceFactory; import biz.e_zero.slim3_test.meta.MemoMeta; import biz.e_zero.slim3_test.model.Memo; @@ -31,7 +32,7 @@ public class MemoService extends DaoBaseEx<Memo>{ MemoMeta m = MemoMeta.get(); // Datastoreのメソッドからsuper classのメソッドに変更(P5) // return Datastore.query(m).sort(m.updateDate.desc).asList(); - List<Key> keys = Datastore.query(m).sort(m.updateDate.desc).asKeyList(); + List<Key> keys = Datastore.query(m).filter(m.userId.equal(getUserId())).sort(m.updateDate.desc).asKeyList(); return super.get(keys); } @@ -41,6 +42,7 @@ public class MemoService extends DaoBaseEx<Memo>{ */ public void insert(Memo memo) { memo.setKey(Datastore.allocateId(MemoMeta.get())); + memo.setUserId(getUserId()); // Datastoreのメソッドからsuper classのメソッドに変更(P5) // Datastore.put(memo); super.put(memo); @@ -53,6 +55,7 @@ public class MemoService extends DaoBaseEx<Memo>{ public void update(Memo memo) { // Datastoreのメソッドからsuper classのメソッドに変更(P5) // Datastore.put(memo); + memo.setUserId(getUserId()); super.put(memo); } @@ -73,4 +76,8 @@ public class MemoService extends DaoBaseEx<Memo>{ update(memo); } } + + public String getUserId() { + return UserServiceFactory.getUserService().getCurrentUser().getUserId(); + } }
IndexControllerの変更
1. UserServiceを作成して、Logout用のURLを作成する。
2. 作成したURLをrequestに設定する。
diff --git a/src/biz/e_zero/slim3_test/controller/memo/IndexController.java b/src/biz/e_zero/slim3_test/controller/memo/IndexController.java index 49ac7ae..1f717bd 100644 --- a/src/biz/e_zero/slim3_test/controller/memo/IndexController.java +++ b/src/biz/e_zero/slim3_test/controller/memo/IndexController.java @@ -8,6 +8,9 @@ import org.slim3.controller.Navigation; import biz.e_zero.slim3_test.model.Memo; import biz.e_zero.slim3_test.service.MemoService; +import com.google.appengine.api.users.UserService; +import com.google.appengine.api.users.UserServiceFactory; + // Controllerを継承してIndexContorollerを作成する。 public class IndexController extends Controller { @@ -18,6 +21,11 @@ public class IndexController extends Controller { response.setHeader("Cache-Control", "no-cache"); response.setDateHeader("Expires", 0); + // UserServiceを作成(P6) + UserService userService = UserServiceFactory.getUserService(); + // logout用URL作成(P6) + request.setAttribute("logout_url", userService.createLogoutURL(request.getRequestURI())); + // MemoServiceのオブジェクトを作成 MemoService service = new MemoService();
index.jspの変更
1. ログアウト用リンクを作成
– リンク先はControllerで作成
diff --git a/war/memo/index.jsp b/war/memo/index.jsp index 0797917..38d03c7 100644 --- a/war/memo/index.jsp +++ b/war/memo/index.jsp @@ -38,6 +38,7 @@ </table> </div> <a href="edit" class="btn btn-lg btn-default">追加</a> + <a href="<%= (String)request.getAttribute("logout_url") %>">ログアウト</a> </div> </div> </body>
web.xmlの変更
1. memo配下のコンテンツをGoogleアカウント必須に設定
– この設定が無いと、未ログインユーザでもコンテンツが見れてしまう。
diff --git a/war/WEB-INF/web.xml b/war/WEB-INF/web.xml index 4d73e55..fa91f52 100644 --- a/war/WEB-INF/web.xml +++ b/war/WEB-INF/web.xml @@ -98,4 +98,12 @@ <role-name>admin</role-name> </auth-constraint> </security-constraint> + <security-constraint> + <web-resource-collection> + <url-pattern>/memo/*</url-pattern> + </web-resource-collection> + <auth-constraint> + <role-name>*</role-name> + </auth-constraint> + </security-constraint> </web-app>
appengine-web.xmlの変更
1. deploy時のアプリケーションバージョンを変更
– [1] → [2016-01-r01]
– ピリオドは使用不可なので、ハイフンを使用してわかりやすいバージョン番号を付与する
diff --git a/war/WEB-INF/appengine-web.xml b/war/WEB-INF/appengine-web.xml index 8cd5233..04508c8 100644 --- a/war/WEB-INF/appengine-web.xml +++ b/war/WEB-INF/appengine-web.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8"?> <appengine-web-app xmlns="http://appengine.google.com/ns/1.0"> <application>slim3-memo</application> - <version>1</version> + <version>2016-01-r01</version> <precompilation-enabled>true</precompilation-enabled>
Google App EngineへのDeploy
変更した内容をApp EngineにDeployします。
1. アプリケーションバージョンが正しく変更されていることを確認する。
2. Project右クリック -> Google -> Deploy to App Engineを選択
Default application versionの変更
実行対象バージョンの切り替えを行う。
(アップロードされた直後のバージョンはデフォルトに設定されていないため、一般には公開されません。)
1. Google Developers Consoleから対象プロジェクトを選択
URL: https://console.developers.google.com
2. App Engineを選択
3. 切り替え対象のバージョンを選択し、デフォルトにするをクリック
Google App Engine上での動作確認
1. 下記URLからアプリケーションを起動する
* Googleアカウントにログインしていない場合は、ログイン画面に遷移する。
– {application name}.appspot.com/memo
2. Googleアカウントを変更して再度ログインし、別アカウントのMemoが表示されていないか確認する。
参考URL: https://slim3-memo.appspot.com/memo/
【関連記事】
Google App Engine 第一回
Google App Engine 第二回
Javaのライブラリを手軽にテストしたい!! Groovy入門 第1回
Google App Engine 第三回
Google App Engine 第四回
Google App Engine 第五回
Google App Engine 第六回
Google App Engine 第七回
Google App Engine 第八回
Google App Engine 第九回
Google App Engine 第十回
Google App Engine 第十一回
- 2016年03月02日
- CATEGORY- 1. 技術力{技術情報}