play-logo

CSRF の脆弱性対策が完了したところで、次にデータベースの接続先を H2データベース から MySQL に変更しましょう。

MySQL への接続

まず、build.sbt を以下のように編集してください。

  • build.sbt
name := "play-scala-intro"

version := "1.0-SNAPSHOT"

lazy val root = (project in file(".")).enablePlugins(PlayScala)

scalaVersion := "2.11.7"

libraryDependencies ++= Seq(
  "com.typesafe.play" %% "play-slick" % "2.0.2",
  "com.typesafe.play" %% "play-slick-evolutions" % "2.0.2",
//  "com.h2database" % "h2" % "1.4.190",
  specs2 % Test,
  filters,
  "mysql" % "mysql-connector-java" % "5.1.36"
)

libraryDependencies のダウンロードが終わったら、"conf/application.conf" を以下のように編集します。

  • conf/application.conf
// 省略
//slick.dbs.default.driver="slick.driver.H2Driver$"
//slick.dbs.default.db.driver="org.h2.Driver"
//slick.dbs.default.db.url="jdbc:h2:mem:play;DB_CLOSE_DELAY=-1"

slick.dbs.default.driver = "slick.driver.MySQLDriver$"
slick.dbs.default.db.driver = "com.mysql.jdbc.Driver"
slick.dbs.default.db.url = "jdbc:mysql://localhost/play_scala_intro?characterEncoding=UTF8"
slick.dbs.default.db.user = "root" 
slick.dbs.default.db.password = "" // ユーザー名、パスワードは自分の環境に合わせて変更してださい。
// 省略

編集できたら、"conf/evolutions/default/1.sql" を以下のように編集します。
play-slick-evolutions は、マイグレーションのライブラリで、1.sql から順番にマイグレーションスクリプトを走らせます。

  • conf/evolutions/default/1.sql
# --- !Ups

create table if not exists play_scala_intro.people(
    id INT not null primary key auto_increment,
    name VARCHAR(255) not null,
    age INT not null
);

# --- create table "people" (
# ---   "id" bigint generated by default as identity(start with 1) not null primary key,
# ---   "name" varchar not null,
# ---   "age" int not null
# --- );


# --- !Downs
drop table if exists people;

# --- drop table "people" if exists;

編集したら、ターミナルで mysql にログインしましょう。

$ mysql -u root -p
パスワードがなければ Enter
> create database play_scala_intro;
> exit

ログインできたら、サーバーを ■ で stop して、▶︎ で sbt run し、サーバーを立ち上げ POST できるか確かめてみよう。
最初は、初期データが、MySQ Lに投入されてないので、"Apply this script now!" ボタンを押してみよう!

27

ここまでできたら、git にコミットしましょう!

git add -A
git commit -m "データベースをh2から、MySQLに変更"

カスタムフィルタの設定

"app/Filters.scala" を削除して、app を右クリック -> New ->Package を選択し、filters という package を作成して、filters で右クリック -> New ->Scala Class を選択して、以下のような、"app/filters/Filters.scala" を作成してみましょう。

package filters

import javax.inject.Inject

import play.api.http.DefaultHttpFilters

import play.filters.csrf.CSRFFilter
import play.filters.headers.SecurityHeadersFilter
import play.filters.hosts.AllowedHostsFilter

/**
  * Add the following filters by default to all projects
  *
  * https://www.playframework.com/documentation/latest/ScalaCsrf
  * https://www.playframework.com/documentation/latest/AllowedHostsFilter
  * https://www.playframework.com/documentation/latest/SecurityHeaders
  */
class Filters @Inject() (
  csrfFilter: CSRFFilter,
  allowedHostsFilter: AllowedHostsFilter,
  securityHeadersFilter: SecurityHeadersFilter
) extends DefaultHttpFilters(
  csrfFilter,
  allowedHostsFilter,
  securityHeadersFilter
)

DefaultHttpFilters を選択して、『Command+B』を押して、定義元にジャンプしましょう。

28

DefaultHttpFilters は、HttpFilters を継承していて、apply に csrfFilter、allowedHostsFilter、securityHeadersFilter が、EssentialFilters*型で渡されて、filter にセットされます。
作成したら、"conf/application.conf" を以下のように変更しましょう。

  • conf/application.conf
# 省略
play.http {
  # 省略
  filters = "filters.Filters" # < - この行を追加
  # 省略
}
# 省略

"conf/application.conf" を変更したら、"http://localhost:9000/" で POST できるか確かめてください。
POST できたら、次に Bootstrap を導入し、いよいよCRUDなRESTful APIを実装してみましょう!

その4へ続く。