2.0からScalaに対応したWebアプリ開発の人気軽量フレームワーク「Play framework」について解説し、Webアプリの作り方を紹介する入門連載。最終回は、Playを使ったアプリケーションを拡張させる仕組み、プラグインの使い方および開発方法を紹介します。
前回の記事「Play2+nginx/Akka/WebSocketで高速双方向通信」では、Play framework 2(以下、Play2)アプリとnginxの連携方法やAkka/WebSocketを使い、並列処理や双方向通信を行う方法を紹介しました。
本連載の最終回となる今回は、Play2アプリを拡張させる仕組み、プラグインの使い方および開発方法を紹介します。
Play2では、「プラグイン」(「モジュール」とも呼ばれます)という仕組みを利用して機能を拡張できます。プラグインを使うと、Play2アプリやPlayコンソールに対して機能追加が可能になります。
Play2アプリをwar化するプラグインやGroovyをテンプレートエンジンとして使えるプラグインなど、さまざまなプラグインが公開されています。
なお、こういったPlay2用のプラグインは、「Document:Play 2.0 Modules」「Play Modules」で探せます。
では、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コマンドを実行すれば、プラグインをインストールできます。
実際にPlay2プラグインを使ってみましょう。ここでは、「SecureSocial」というOAuth/OAuth 2/独自認証に対応した認証のためのプラグインを使ってみます。
このプラグインはいろいろなサービスを使って認証が行え、Twitter/Facebook/Google/LinkedIn/Instagramなどのアカウントを使えます。今回はこのプラグインを使い、Facebookを使った認証を実装してみましょう。
まずは今回の認証に使うためのFacebookアプリを「Facebook Developer」で作成しておきます。
Facebook Developerのメニューからアプリ→新しいアプリを作成を選択し、Display Name/Namespace/カテゴリを入力してアプリを作成します。
アプリを作成したら画面左のメニューから設定を選択し、「+Add Platform」ボタンを押します。Webサイトを選択し、サイトURLとMobile Site URLに「http://localhost:9000/」と入力します。
登録したアプリのアプリケーションIDとシークレットキーは後で必要になるので覚えておきましょう。
次に、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アプリの登録」の章で確認した値を設定しておきます。
Copyright © ITmedia, Inc. All Rights Reserved.