KEIS BLOGは株式会社ケイズ・ソフトウェアが運営しています。

KEIS BLOG

Google App Engine 第十二回


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を選択

misawa01

Default application versionの変更

実行対象バージョンの切り替えを行う。
(アップロードされた直後のバージョンはデフォルトに設定されていないため、一般には公開されません。)

1. Google Developers Consoleから対象プロジェクトを選択

URL: https://console.developers.google.com

2. App Engineを選択

3. 切り替え対象のバージョンを選択し、デフォルトにするをクリック
misawa02

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 第十一回