コード内からログアウトする
今度は、Authenticationに任せていた処理をプログラム内から実行させる方法についてです。ログイン、ログアウト、サインアップといった操作は、Authenticationに用意されている専用のタグを使ってフォームを作り、Authenticationのアクションに送って処理させていました。が、これらをプログラム内から処理させたい、という場合もあるでしょう。この方法についても触れておきましょう。
まずは、ログアウト処理からです。ここではloginアクションに移動したとき、自動的にログアウトを行うようにしてみましょう。AuthControllerのloginクロージャを次のように修正します。
def login = {
if (authenticationService.isLoggedIn(request)) {
def user = session.authenticatedUser
session.authenticatedUser = null
authenticationService.logout(user)
}
}
これで、loginにアクセスすると自動的にログアウトします。ここでは、authenticationService.isLoggedInでログイン状態をチェックし、ログインしているときには次のような手順でログアウト処理を行っています。
def user = session.authenticatedUser
まず、セッションのauthenticatedUserの値を変数に取り出します。authenticatedUserは、セッションに保管されているユーザーの値です。これはAuthenticatedUserというクラスのオブジェクトの形になっています。
session.authenticatedUser = null
session.authenticatedUserの値をnullにし、セッションに保管されるAuthenticationUserオブジェクトを取り除きます。
authenticationService.logout(user)
続いて、authenticationServiceのlogoutを呼び出します。これは、引数に指定したAuthenticationUserオブジェクトをもとにログアウトを試みます。ログアウトは、このように「session.authenticatedUserのnull化」と「authenticationService.logoutの呼び出し」を行うことで実行されます。
コード内からログインする
続いて、ログイン処理についてです。今度はindexアクションを修正し、ログインせずにアクセスしたら、自動的に「guestuser」というユーザー名でログインするようにしてみましょう。これを行う前に、あらかじめ「guestuser」という名前のユーザーID(パスワードもguestuser)を登録しておいてください。
AuthControllerのindexクロージャを次のように修正してください。これで作業は完了です。実際にindexにアクセスし、未ログイン状態だとguestuserで自動ログインされるのを確認してください。
def index = {
if (!authenticationService.isLoggedIn(request)) {
def loginResult = authenticationService.login('guestuser','guestuser')
session.authenticatedUser = loginResult
}
}

ここでは、authenticationService.isLoggedInでログインされているかどうかをチェックし、ログインしていない場合には、まず「authenticationService.login」でログインを実行します。
def loginResult = authenticationService.login('guestuser','guestuser')
このloginは、ログインするユーザーIDとパスワードを引数に渡して呼び出します。これを実行すると、authenticationServiceは指定された引数の値を使ってログインを試み、AuthenticationUserという認証ユーザーのインスタンスを返します。
session.authenticatedUser = loginResult
返されたAuthenticationUserを、session.authenticatedUserに設定します。これでログイン処理は終了です。ログインも、ログアウトと同様に「authenticationService.loginの実行」「session.authenticatedUserへの設定」という作業で実行されます。
おわりに
これで、サインアップ、ログイン、ログアウトといった基本操作、そしてログインされた状態やログインしているユーザー情報などの表示、といった認証に必要な基本的な機能についての説明を終わります。
Authenticationは、とりあえずログインとログアウトさえ分かればすぐに使えるものです。データの保管や管理などを考えることなく、シンプルなフォームとカスタムタグさえ分かれば利用することができます。
ログイン状態のチェックや細かな制御などはコントローラーにコードを置いて行うこともできますすが、まずは「ビュー側だけで実装する」やり方を理解しましょう。ビューの修正だけで認証の基本はすべて実現できます。コントローラー側の処理は、もう少しステップアップしたいと思うようになったら使ってみる、と考えておくとよいでしょう。
