Scala on GAE/Jでアカウント認証(2)
前回に続きGoogle App Engine for Java上でScalaサーブレットを使いつつ、アカウント認証プログラムを作っていきます。
LoginControllerから直接ログイン後ページに遷移していたものを改造し、間にRoleControllerというログインユーザの権限を付与するためのロジックを挟んでみました。
LoginController.scala
package jp.tantack.nasg.controller import com.google.appengine.api.users.UserService; import com.google.appengine.api.users.UserServiceFactory; import javax.servlet.http.{HttpServlet , HttpServletRequest => HSReq , HttpServletResponse => HSResp} class LoginController extends HttpServlet { override def doGet(req : HSReq, resp : HSResp) = { // ログインしてない場合はトップページに戻る if(req.getUserPrincipal() == null) resp.sendRedirect("/index.jsp"); val service = UserServiceFactory.getUserService(); val url = service.createLoginURL("/role"); resp.sendRedirect(url); } }
RoleController.scala
package jp.tantack.nasg.controller import jp.tantack.nasg.model.RoleLogic; import com.google.appengine.api.users.UserService; import com.google.appengine.api.users.UserServiceFactory; import javax.servlet.http.{HttpServlet , HttpServletRequest => HSReq , HttpServletResponse => HSResp} class RoleController extends HttpServlet { override def doGet(req : HSReq, resp : HSResp) = { // ログインしてない場合はトップページに戻る if(req.getUserPrincipal() == null) resp.sendRedirect("/index.jsp"); val service = UserServiceFactory.getUserService(); val user = service.getCurrentUser(); val logic = new RoleLogic(); // ログインユーザの権限を判断してセット req.setAttribute("role", logic.role(user)); val context = getServletContext(); val reqDispatcher = context.getRequestDispatcher("/master/index.jsp"); reqDispatcher.forward(req, resp); } }
RoleLogic.scala
package jp.tantack.nasg.model import com.google.appengine.api.users.User; class RoleLogic { def role(user: User): String = { val email = user.getEmail(); // ここにデータストアから取得してきたユーザ情報の処理を入れる // ログインユーザのメールアドレス判定結果を戻す return if("test@example.com".equals(email)) "admin" else "user"; } }
/master/index.jsp
<%@ page contentType="text/html; charset=UTF-8" %> <%@taglib prefix="c" uri="http://java.sun.com/jstl/core"%> <html> <head> <title></title> </head> <body> <p><c:out value="${role}" />権限でログインしたよ!</p> <p><a href="/logout">ログアウトするよ!</a></p> </body> </html>
変数や処理はかなり適当になっていますが、ログイン者のメールアドレスをDatastoreに格納されているものと照合し(Datastore関連の処理は未実装)、格納されているならAdmin権限を付与する!ってなことをやろうとしています。
admin権限でログインしたよ!
ローカルのアカウント認証サービスは、デフォルトでは"test@example.com"でログインするようになっているため、実行結果は上のようになりました。
次回でDatastore周りの実装を作りこみ、アカウント認証サービスを使ってユーザ権限を付与する処理を一通りできるようにしてみたいと思います。