Help us understand the problem. What is going on with this article?

Go言語、buffaloのログイン処理を作成してみる

この記事は Go4 Advent Calendar 2019 の 9 日目の記事です。

8日目の記事はこちら

go buffaloとは

https://gobuffalo.io/en

go言語で作られたrailsっぽいフレームワークです。
早くて軽くて開発環境も最初からホットリロード付きで非常に快適に開発を進めることができます。
テストも簡単に書けますよ。

インストール方法などはこちらの記事を参照ください。

ログイン機能を作りたい

さっそくログイン機能を作っていきましょう。

まずはプラグインのインストールです。

buffalo plugins install github.com/gobuffalo/buffalo-auth

初期設定を行います。

## 作成されるファイルを確認
buffalo-auth auth -d

## userモデルとテンプレートを作成
buffalo-auth auth

## soda CLIを利用するのでコマンドをインストール
go install github.com/gobuffalo/pop/soda

## migrationを実行
soda migrate

## 開発環境の立ち上げ
buffalo dev

生成されるファイルは以下の通り

create  models/user.go
create  models/user_test.go
    run  goimports -w actions/actions_test.go actions/app.go actions/home.go actions/home_test.go actions/render.go grifts/db.go grifts/init.go main.go models/models.go models/models_test.go models/user.go models/user_test.go
create  migrations/20180910062057_create_users.up.fizz
create  migrations/20180910062057_create_users.down.fizz
create  actions/auth.go
create  actions/auth_test.go
create  actions/users.go
create  actions/users_test.go
create  models/user_test.go
create  actions/home_test.go
create  templates/auth/new.html
create  templates/index.html
create  templates/users/new.html

ここまでで開発環境(buffalo devを実行)で以下のようにページが見れるはずです。

FireShot Capture 002 - Buffalo - Auth Example - localhost.png

registerを押下

FireShot Capture 003 - Buffalo - Auth Example - localhost.png

ここでhomehandlerによって呼び出されるtemplates/index.plush.htmlに変更が入って以下のようになります。

<div class="auth-center">
  <%= if (current_user) { %>
    <h1><%= current_user.Email %></h1>
    <a href="/signout" data-method="DELETE">Sign Out</a>
  <% } else { %>
    <a href="/signin" class="btn btn-primary">Sign In</a>
    <a href="/users/new" class="btn btn-success">Register</a>
  <% } %>
</div>

railsと同じように currente_user で条件分岐していることがわかりますね。

管理者フラグを追加してみる

せっかくなので管理者フラグを付けてみましょう。
まずはマイグレーションファイルを生成します

soda g fizz  add_admin_flag_to_users

出来上がったファイルを以下のように編集します。

down.fizzファイルの中身

drop_column("users", "admin_flag")

up.fizzファイルの中身

add_column("users", "admin_flag", "boolean",  {"null": true})

soda migrateを実行してDBに反映させます

テンプレートファイルの修正

templates/users/new.plush.htmlのフォームの中に以下を追加します。

<%= f.SelectTag("AdminFlag", {options: {"Normal User": 0, "AdminUser": 1}, value: 0}) %>

モデルファイルの修正

models/user.goを以下のように修正します。

type User struct {
    ID           uuid.UUID  `json:"id" db:"id"`
    CreatedAt    time.Time  `json:"created_at" db:"created_at"`
    UpdatedAt    time.Time  `json:"updated_at" db:"updated_at"`
    Email        string     `json:"email" db:"email"`
    PasswordHash string     `json:"password_hash" db:"password_hash"`
    AdminFlag    nulls.Bool `json:"admin_flag" db:"admin_flag"`

    Password             string `json:"-" db:"-"`
    PasswordConfirmation string `json:"-" db:"-"`
}

ここまでやればフォームが下のようになり、ユーザの作成時に権限を選択することができます。

コメント 2019-12-08 193920.png

あとはこんな風に書いてあげれば良いだけですね。

  <%= if (current_user.AdminFlag) { %>
      管理者の処理
  <% }%>

試しにユーザを作成するとちゃんとフラグにboolの値が入っていますね。
コメント 2019-12-08 193958.png

ではでは、go buffaloでログインするまででした。
明日はsyumaiさんの記事にになります。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした