連載
» 2014年01月28日 18時00分 UPDATE

Scala+Play 2.0でWebアプリ開発入門(終):Play2プラグインのインストールと使用と新規開発 (1/3)

2.0からScalaに対応したWebアプリ開発の人気軽量フレームワーク「Play framework」について解説し、Webアプリの作り方を紹介する入門連載。最終回は、Playを使ったアプリケーションを拡張させる仕組み、プラグインの使い方および開発方法を紹介します。

[中村修太,クラスメソッド株式会社]

 前回の記事「Play2+nginx/Akka/WebSocketで高速双方向通信」では、Play framework 2(以下、Play2)アプリとnginxの連携方法やAkka/WebSocketを使い、並列処理や双方向通信を行う方法を紹介しました。

 本連載の最終回となる今回は、Play2アプリを拡張させる仕組み、プラグインの使い方および開発方法を紹介します。

Play2プラグインとは

 Play2では、「プラグイン」(「モジュール」とも呼ばれます)という仕組みを利用して機能を拡張できます。プラグインを使うと、Play2アプリやPlayコンソールに対して機能追加が可能になります。

 Play2アプリをwar化するプラグインやGroovyをテンプレートエンジンとして使えるプラグインなど、さまざまなプラグインが公開されています。

 なお、こういったPlay2用のプラグインは、「Document:Play 2.0 Modules」「Play Modules」で探せます。

「Deadbolt」で試すPlay2プラグインのインストール

 では、Play2プラグインをどのようにすれば使えるのか解説しましょう。

 連載第7回の「Play 2.xからMySQLに接続してAnormでCRUD操作するには」では、Build.scalaのappDependencies(場合によってはplugins.sbt)に記述することで、MySQL用のJDBCドライバを追加しました。

 これと同じように、Play2のプラグインも追加できます。

 例えば、project/Build.scalaファイルに次のような記述をすれば、プラグインをインストールできます。プラグインを追加するには、play.Projectでリポジトリの追加と、appDependenciesでプラグインのバージョンを指定します。

・
・
・
   val appDependencies = Seq(
      "be.objectify" %% "deadbolt-scala" % "2.1-RC3"
    )
   val main = play.Project(appName, appVersion, appDependencies).settings(
      resolvers += Resolver.url("Objectify Play Repository", url("http://schaloner.github.com/releases/"))(Resolver.ivyStylePatterns),
      resolvers += Resolver.url("Objectify Play Repository - snapshots", url("http://schaloner.github.com/snapshots/"))(Resolver.ivyStylePatterns),
      resolvers += "typesafe" at "http://repo.typesafe.com/typesafe/repo"
    )
・
・
・

 ここでインストールしている「Deadbolt」というプラグインは、コントローラーのメソッドや、ビューにシンプルなAND/OR/NOT形式の文法でアクセス権限を定義し、認証の仕組みを実現できるプラグインです。

 Build.scalaに上記の記述をした後、Playコンソール上でplay reloadコマンドを実行しましょう。その後、dependenciesコマンドを実行すれば、プラグインをインストールできます。

「SecureSocial」でPlay2プラグインをカスタマイズして使ってみる

 実際にPlay2プラグインを使ってみましょう。ここでは、「SecureSocial」というOAuth/OAuth 2/独自認証に対応した認証のためのプラグインを使ってみます。

 このプラグインはいろいろなサービスを使って認証が行え、Twitter/Facebook/Google/LinkedIn/Instagramなどのアカウントを使えます。今回はこのプラグインを使い、Facebookを使った認証を実装してみましょう。

Facebookアプリの登録

 まずは今回の認証に使うためのFacebookアプリを「Facebook Developer」で作成しておきます。

 Facebook Developerのメニューからアプリ→新しいアプリを作成を選択し、Display Name/Namespace/カテゴリを入力してアプリを作成します。

 アプリを作成したら画面左のメニューから設定を選択し、「+Add Platform」ボタンを押します。Webサイトを選択し、サイトURLとMobile Site URLに「http://localhost:9000/」と入力します。

scalaplay12_1.jpg FacebookアプリのWebサイト設定

 登録したアプリのアプリケーションIDとシークレットキーは後で必要になるので覚えておきましょう。

SecureSocialプラグインのインストール

 次に、project/Build.scalaに依存関係の記述をします。下記のように、SecureSocialプラグインのバージョンとリポジトリを設定しましょう。

・
・
・
  val appDependencies = Seq("securesocial" %% "securesocial" % "2.1.2")
  //Play2.2以降の場合:"securesocial" %% "securesocial" % "master-SNAPSHOT"
  val main = play.Project(appName, appVersion, appDependencies).settings(
    resolvers += Resolver.url("sbt-plugin-releases", new URL("http://repo.scala-sbt.org/scalasbt/sbt-plugin-releases/"))(Resolver.ivyStylePatterns)
    /*
    Play2.2以降の場合:
    resolvers += Resolver.url("sbt-plugin-snapshots", 
    new URL("http://repo.scala-sbt.org/scalasbt/sbt-plugin-snapshots/"))(Resolver.ivyStylePatterns)) 
    */
・
・
・

 2014年1月現在、Play 2.1と2.2では設定する内容が違うので注意してください。現状Play 2.2に対応したSecuresocialプラグインは、masterスナップショットから取得します。

 ここまで記述したら、Playコンソールを起動してから設定ファイルを更新し、依存するライブラリをダウンロードしましょう。

$ play
・
・
・
[gyro] $ reload
[gyro] $ dependencies

設定ファイルの追加

 次に、conf/routesにSecuresocial用コントローラーの設定を追加します。

・
・
・
# Login page
GET     /login                      securesocial.controllers.LoginPage.login
GET     /logout                     securesocial.controllers.LoginPage.logout
# User Registration and password handling 
GET     /signup                     securesocial.controllers.Registration.startSignUp
POST    /signup                     securesocial.controllers.Registration.handleStartSignUp
GET     /signup/:token              securesocial.controllers.Registration.signUp(token)
POST    /signup/:token              securesocial.controllers.Registration.handleSignUp(token)
GET     /reset                      securesocial.controllers.Registration.startResetPassword
POST    /reset                      securesocial.controllers.Registration.handleStartResetPassword
GET     /reset/:token               securesocial.controllers.Registration.resetPassword(token)
POST    /reset/:token               securesocial.controllers.Registration.handleResetPassword(token)
GET     /password                   securesocial.controllers.PasswordChange.page
POST    /password                   securesocial.controllers.PasswordChange.handlePasswordChange
・
・
・

 そして、「conf」ディレクトリに「play.plugins」という名前で新しいファイルを作成しましょう。そこでは下記のように、プラグインの実行優先度とクラスを指定します。

1500:com.typesafe.plugin.CommonsMailerPlugin
9994:securesocial.core.DefaultAuthenticatorStore
9995:securesocial.core.DefaultIdGenerator
9996:securesocial.core.providers.utils.DefaultPasswordValidator
9997:securesocial.controllers.DefaultTemplatesPlugin
9998:services.MyUserService ←この後に作成するクラス
#ユーザー名とパスワードを入力させる通常のフォーム
#9999:securesocial.core.providers.utils.BCryptPasswordHasher
#10004:securesocial.core.providers.UsernamePasswordProvider
10001:securesocial.core.providers.FacebookProvider

 今回はFacebookアカウントを使って認証を行うので、FacebookProvider(優先順位は10001)を使います。

 このように、SecureSocialプラグインはモジュール式アーキテクチャとなっており、任意の組み込みプラグインを使えます。

 「SecureSocialの公式サイト」にあるように、TwitterProviderやGoogleProviderなど、主要なサービスに対応した認証用Providerがあります。

 なお、9998で指定しているクラスは、この後で作成するUserServiceクラスです。

 conf/application.confでは、SecureSocial用設定を記述する「conf」ファイルをincludeします。

include "securesocial.conf"

 confディレクトリにsecuresocial.confを下記内容で記述しましょう。smtpブロックはUsernamePasswordProviderを使う場合にパスワードリマインダで使う際の設定です。

smtp {
    host=smtp.gmail.com     
    #port=25     
    ssl=true
    user="{ユーザー名}"     
    password="{パスワード}"
    from="{メールアドレス}"
}
securesocial {
    onLoginGoTo=/
    onLogoutGoTo=/login
    ssl=false   
    cookie {
      #name=id
      #path=/
      #domain=some_domain
      #httpOnly=true
      #idleTimeoutInMinutes=30
      #absoluteTimeoutInMinutes=720
    }
    facebook {
     authorizationUrl="https://graph.facebook.com/oauth/authorize"
     accessTokenUrl="https://graph.facebook.com/oauth/access_token"
     clientId="{アプリケーションID}"
     clientSecret="{シークレットキー}"
     scope=email
    }
}

 facebookブロックのclientIdとclientSecretに「Facebookアプリの登録」の章で確認した値を設定しておきます。

       1|2|3 次のページへ

Copyright© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。