SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Groovy+GrailsでRailsなWeb開発

GrailsのAuthenticationプラグインによる認証

Groovy+GrailsでRailsなWeb開発 第5回

ログインして表示されるページ

 では、続いてindex.gspを作成しましょう。これは、ログインしていると表示されるようにしておきます。次のようにソースコードを記述しましょう。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>Grails Helo</title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
        <style type="text/css">
            h1 {background:#AAAAFF; font-size: 12pt; padding: 3px;}
            h2{font-size: 12pt; font-weight: bold;}
            p{color:#000066; font-size:10pt;}
        </style>
    </head>
    <body>
        <h1>Grails Auth</h1>
        <div>
            <auth:user property="login" />
        </div>
        <h2>This is Index Action Page.</h2>
        これは、ログインしなければ見られないページです。
    </body>
</html>
図6 indexのページ。ログインしていないと表示されない。ログインしているユーザーIDが表示される。これもコントローラーができてないと動かないので注意!
図6 indexのページ。ログインしていないと表示されない。ログインしているユーザーIDが表示される。これもコントローラーができてないと動かないので注意!

 このページ自体は、いわばダミーですのでごく普通のWebページでいいのですが、それだけでは面白くないのでちょっとした仕掛けを入れておきました。<auth:user property="login" />というのがそれです。

 <auth:user>というタグは、ログインしているユーザーに関する情報を表示するためのものです。property="login"と属性を指定することで、ログインIDを出力することができます。現在、何というユーザーIDでログインしているか、これで表示できます。

AuthControllerの作成

 では、コントローラーを作成しましょう。「controllers」に自動生成されているAuthController.groovyを開き、次のように修正してください。

class AuthController {
    def authenticationService

    def index = {
        if (!authenticationService.isLoggedIn(request)) {
            response.sendError(403)
        }
    }
    
    def login = { }
}

 これで完成です。ここでは、authenticationServiceというフィールド、そしてindexとloginのアクション用のクロージャが用意されています。最初のauthenticationServiceという変数は、Authenticationによって提供される認証機能に関する「AuthenticationService」というクラスのインスタンスです。この変数名をクラス内に用意することで、自動的にauthenticationServiceオブジェクトが利用可能になります。

 indexクロージャでは、このauthenticationServiceに用意されている「isLoggedIn」というメソッドを利用しています。これはログインされているかどうかを調べ真偽値を返すもので、引数にはrequestが指定されます。この返値がtrueならばログインしており、falseならばしていないことを示します。

 ログインしていない場合には、403のサーバーエラーを発生させています。これはresponseの「sendError」で行うことができます。これは引数に指定したエラー番号のサーバーエラーを発生させるものです。

 では、実際にloginアクションにアクセスしてログインを行ってみましょう。ログインすればindexが表示されますが、ログインに失敗するとサーバーエラーになります。

図7 ログインせずにindexにアクセスすると、このようなサーバーエラーが表示される。
図7 ログインせずにindexにアクセスすると、このようなサーバーエラーが表示される。

ログインの送信先は?

 それにしても、コントローラーを見てみても、ログインに関する処理は何もありません。これを見て、「どこでログイン処理をしているんだ?」と疑問に思ったかもしれません。その疑問は、loginアクションにアクセスし、表示されるフォームのソースコードを調べると氷解します。先に、<auth:form>タグで記述されたフォームは、実際には次のようなHTMLソースコードにレンダリングされていることが分かります。

<form action="/gapp/authentication/login" method="post" >
<input type="hidden" name="success_controller" value="auth" id="success_controller" />
<input type="hidden" name="success_action" value="index" id="success_action" />
<input type="hidden" name="error_controller" value="auth" id="error_controller" />
<input type="hidden" name="error_action" value="login" id="error_action" />

 フォームは、/gapp/authentication/loginに送信されています。これは、Authenticationプラグインによって自動的に用意されるauthenticationコントローラのloginアクションに送信されているのです。その際、成功時とエラー時の挙動に関する情報も、<input type="hidden">によって受け渡されていることが分かります。

 Authenticationプラグインを組み込むと、このようにAuthenticationというコントローラーが用意され、そこに必要な処理を行うためのアクションが用意されます。それらアクションを実行することで、認証に関する処理が行われていたのです。

次のページ
ログアウト機能の追加

この記事は参考になりましたか?

Groovy+GrailsでRailsなWeb開発連載記事一覧

もっと読む

この記事の著者

掌田 津耶乃(ショウダ ツヤノ)

三文ライター&三流プログラマ。主にビギナーに向けたプログラミング関連の執筆を中心に活動している。※現在、入門ドキュメントサイト「libro」、カード型学習サイト「CARD.tuyano.com」を公開...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/4106 2009/07/22 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー