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.
Java Agile 髫ェ蛟�スコ荵斟帷ケ晢スウ郢ァ�ュ郢晢スウ郢ァ�ー