Hatena::ブログ(Diary)

すにぺっと

2011-05-17

play-scalaを改めて学ぶ-13 yabeっぽいのつくる その2

| 01:40 | play-scalaを改めて学ぶ-13 yabeっぽいのつくる その2を含むブックマーク

今回もyabeっぽいのつくってく。

前回ユーザー登録をつくったので、今回はログインでもつくろう。


前回つくったユーザー登録で登録したユーザーのemailと

パスワードを入力し、正しければBlog画面へ、正しくなければ

エラーメッセージを表示する。


1.route追加

2つのrouteを追加する。

#top page
POST    /login                            	   CommonController.login

# Blog page
GET     /blog                                  BlogController.index

ログイン用のパスと、ログイン成功後のパス。


2.loginメソッドを実装

CommonControllerにloginメソッドを追加。

  def login(user: User) = {
    Logger.info("Common#login")
    //email,passwordで検索
    User.find("email={email} AND password={password}")
      .on("email" -> user.email).on("password" -> user.password).first() match {
        case Some(u:User) => 
          session.put("user",u)
          Action(BlogController.index)
        case None => 
          flash += "error" -> "Login Error!"
          index
      }
  }

Magicのfindメソッドを使用して検索。

firstじゃなくてsingleじゃダメなのかと思ったけど、

うまく動かなかった。。。

1件か0件のときってどのメソッド使えばいいんだろう?

結果はOptionでうけて、ログインOKなら

sessionにユーザー情報を保存してBlogページへ。

Cacheを使うのが普通??

ログインNGならエラーメッセージをセットして元のページへ。


3.BlogController作成

object BlogController extends Controller {

  def index = {
    Logger.info("BlogController#index")
    Template
  }
}

とりあえずページを表示するだけ。


4.CommonControllerのindexページ修正

#{extends 'main.html' /}
#{set title:'ログイン' /}

#{if flash.error}
    <p style="color:#c00">
        ${flash.error}
    </p>
#{/if}    

<h1>create user!</h1>
<br />
<form action="@{CommonController.login()}" method="POST">
	email:<input type="text" name="user.email" /><br /> 
	password:<input type="text" name="user.password" /><br /> 
	<input type="submit" value="login" />
</form>
<br/>
<a href="/user">ユーザー登録</a>

エラーメッセージの表示とログインフォーム追加。

あと、views/BlogController/index.htmlも追加。

#{extends 'main.html' /} #{set title:'Blogトップ' /}
<h1>Blog!</h1>

これで アプリケーションを起動する。

ユーザー登録で登録したIDとパスをログインで入力すれば

blogページへ。

だめならエラーメッセージ表示。

これでログインが一応実装できた。

しかし/blogを直打ちすると、そのままいけてしまう。

なので、@Beforeとかつかってログインチェックを自動でする仕組みを追加。


5.Secureトレイト追加

playのドキュメントでもサンプルとしてのってた、secureトレイトを実装。

trait Secure {
  self: Controller =>

  @Before
  def checkSecurity = {
	  val ses = session.get("user")
	  if(ses == null) {
          flash += "error" -> "Please Login!"
          Action(CommonController.index)
	  } else {
		  Continue
	  }
  }
}

ログイン時にsession.putしたので、それの存在チェックをすることで

ログインチェックを行っている。

ScalaっぽくSomeでmatchさせたかったんだけどうまくいかず。

MLではCacheをつかってセッションチェックっぽいことやってたけど、

これもうまくいかず。。。


そしてBlogControllerにmix-in

object BlogController extends Controller with Secure {
・・・
}

これでログインチェックがきくようになった。


次もちょっとずつ拡張していく。



プログラミングScala
プログラミングScala
posted with amazlet at 11.05.18
Dean Wampler Alex Payne
オライリージャパン
売り上げランキング: 56482

トラックバック - http://d.hatena.ne.jp/sy-2010/20110517/1305650450
リンク元