SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Groovy+GrailsでRailsなWeb開発

GroovyとGoogle App Engineでアプリ開発(番外編)
~GAEで利用できるさまざまなサービス

Groovy+GrailsでRailsなWeb開発 第8回


  • X ポスト
  • このエントリーをはてなブックマークに追加

認証処理の流れを整理する

 では、アクセス時にどのようにして認証処理を行っているのか整理しましょう。まず最初に、「UserService」クラスのインスタンスを取得します。

「UserService」クラスのインスタンスを取得
service = UserServiceFactory.getUserService()

 UserServiceFactoryは、文字どおりUserServiceインスタンスを取得するためのものです。このgetUserServiceを呼び出してUserServiceが取得できます。このUserServiceには、ユーザー認証に関する各種の機能が用意されています。ログインしているかどうかは、「isUserLoggedIn」を利用します。

ログインしているかどうかのチェック
if (!service.isUserLoggedIn()){……略……

 このように、isUserLoggedIntrueであれば、ログインしていると判断できます。ログインしていない場合には、ログインページのアドレスを取得し、リダイレクトします。

未ログインの場合、ログインページのアドレスを取得してリダイレクトする
String url = service.createLoginURL("authed.gsp")
response.sendRedirect(url)

 ログインページは、UserServiceの「createLoginURL」で取得できます。引数には、ログイン後に移動するページのURLを指定します。これにより、ログイン後に指定されたURLへと移動するように設定できます。後は、sendRedirectで取得したURLにリダイレクトするだけです。

 同系統の機能として、ログアウトのURLを返す「createLogoutURL」メソッドや、管理者としてアクセスしているかどうかをチェックする「isUserAdmin」といったメソッドも用意されています。使い方は、それぞれcreateLoginURLisUserLoggedInと同じです。あわせて覚えておくと良いでしょう。

 では、続いてログインしている場合の処理を見てみましょう。ログインしているユーザーの情報は「User」クラスにまとめられています。まずはこのインスタンスを取得します。

「User」クラスのインスタンスを取得
User usr = service.getCurrentUser()

 先ほどのUserServiceにある「getCurrentUser」でUserインスタンスが得られます。後は、必要に応じてここから情報を取り出していくだけです。ニックネームとメールアドレスを取り出している部分は、それぞれ次のようにしています。

ニックネームとメールアドレスを取り出している部分
<%=usr.getNickname() %>
<%=usr.getEmail() %>

 「getNickname」でニックネームを、「getEmail」でメールアドレスをそれぞれ取り出しています。非常に簡単です。ただし、これらはローカル環境では、正しい値が取得されません。動作を確認する場合は、Googleサーバにデプロイしましょう。

Gmailによるメール送信

 続いて、「Gmailによるメールの送信」についてです。といっても、実は「Gmailのためのライブラリ」が用意されているわけではありません。GAE/Jでは、JavaMailを利用してメール送信を行うと、自動的にGmailのサーバよりメールが送られるようになっているのです。

 では、これも実際にやってみましょう。今回は、サーブレットとしてメールの送信処理を用意することにしましょう。「src」内に「MailServlet.groovy」という名前でファイルを作成し、以下のソースコードを記述します。

「MailServlet.groovy」ファイルの内容
import java.util.Properties
import javax.mail.*
import javax.mail.internet.*
import javax.servlet.http.*
import com.google.appengine.api.users.*

class MailServlet extends HttpServlet {
    private UserService service;
   
    void doGet(HttpServletRequest request, HttpServletResponse response)
            throws IOException {
        response.contentType = "text/plain"
        response.setCharacterEncoding("UTF-8")
        response.writer.println "can't access me!"
    }
   
    void doPost(HttpServletRequest request, HttpServletResponse response)
            throws IOException {
        response.contentType = "text/html"
        response.setCharacterEncoding("UTF-8")
        if (this.checkLogin()){
            User usr = service.getCurrentUser();
            String from_s = usr.getEmail()
            String title_s = request.getParameter("title")
            String content_s = request.getParameter("content")
            String to_s = "hoge@example.com" // ★宛先
            Properties ps = new Properties()
            Session ses = Session.getDefaultInstance(ps, null)
            try {
                MimeMessage msg = new MimeMessage(ses)
                msg.setFrom(new InternetAddress(from_s))
                msg.addRecipient(Message.RecipientType.TO,
                        new InternetAddress(to_s))
                msg.setSubject(title_s,"ISO-2022-JP")
                msg.setText(content_s)
                Transport.send(msg)
            } catch(e){}
            response.sendRedirect("result.html")
        } else {
            String url = service.createLoginURL("/mail")
            response.sendRedirect(url)
        }
    }
   
    boolean checkLogin(String s){
        service = UserServiceFactory.getUserService()
        if (service.isUserLoggedIn()){
            return true
        } else {
            return false
        }
    }
}

 ここでは、POSTで必要な情報を送信したときに、それをもとにメールを送るようにしてあります。GETでは、簡単なメッセージを表示するだけにしてあります。ここでは、サンプルとして「hoge@example.com」宛にメールを送るようにしてあります。★部分のメールアドレスを、それぞれのアドレスに書き換えて使ってください

※注意

 上記のサンプルコードのままファイルを作成してしまうと、メールは架空のアドレスに送られてしまいますので正しく送信されません。必ず変更してください

 具体的なソースコードの内容を説明する前に、その他の処理も作成しておきましょう。まずはサーブレットの登録です。web.xmlの<web-app>内に、次のようにタグを追記してください。

MailServletを/mailというURIに割り付ける
<servlet>
    <servlet-name>MailServlet</servlet-name>
    <servlet-class>MailServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>MailServlet</servlet-name>
    <url-pattern>/mail</url-pattern>
</servlet-mapping>

 ここでは、MailServletを/mailというURIに割り付けておきました。送信フォームを作成し、/mailに向けてPOSTすれば、サーブレットが呼び出され、メールが送信される、というわけです。

次のページ
メール送信フォームの作成

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Groovy+GrailsでRailsなWeb開発連載記事一覧

もっと読む

この記事の著者

掌田 津耶乃(ショウダ ツヤノ)

三文ライター&三流プログラマ。主にビギナーに向けたプログラミング関連の執筆を中心に活動している。※現在、入門ドキュメントサイト「libro」、カード型学習サイト「CARD.tuyano.com」を公開...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/4400 2009/10/09 20:27

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング