Chapter 27無料公開

実践編:会員ページ作成 5 <パーミッション設定>

パーミッションの設定

権限を設定する機能をつけましょう。まずは登録ページにPermissionという項目を追加します。

signup.gohtml
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>SIGNUP</title>
</head>
<body>

<form method="POST">

    <input type="email" name="username" placeholder="email"><br>
    <input type="text" name="password" placeholder="password"><br>
    <input type="text" name="firstname" placeholder="first name"><br>
    <input type="text" name="lastname" placeholder="last name"><br>
    <label for="sr">Permission</label>
    <select name="permission" id="sr">
        <option value="user">user</option>
        <option value="admin">admin</option>
        <option value="dog">dog</option>
    </select>
    <input type="submit">

</form>

</body>
</html>

それではgoファイルを書いていきましょう。といっても大したことはありません。データ要素としてパーミッションを追加して、そのパーミッションごとに挙動を変えればいいだけです。データ要素の追加はuser構造体に要素を追加するだけです。

main.go user
type user struct {
	UserName   string
	Password   []byte
	First      string
	Last       string
	Permission string
}

登録ページに要素を追加します。追加する箇所は2か所だけです。

main.go signup
func signup(w http.ResponseWriter, req *http.Request) {

	// すでにログインしている場合はこのページは必要ない
	if alreadyLoggedIn(req) {
		http.Redirect(w, req, "/", http.StatusSeeOther)
		return
	}

	// FORMから送信してきたときの処理
	if req.Method == http.MethodPost {
		un := req.FormValue("username")
		p := req.FormValue("password")
		f := req.FormValue("firstname")
		l := req.FormValue("lastname")
		s := req.FormValue("permission") // ここを追加した

		// もしユーザーネームが既に使われていたらエラーにする
		if _, ok := dbUsers[un]; ok {
			http.Error(w, "Username already taken", http.StatusForbidden)
			return
		}

		// セッションDBを作成
		sID := uuid.New()
		c := &http.Cookie{
			Name:  "session",
			Value: sID.String(),
		}
		http.SetCookie(w, c)
		dbSessions[c.Value] = un

		// パスワードを暗号化して保存
		bs, err := bcrypt.GenerateFromPassword([]byte(p), bcrypt.MinCost)
		if err != nil {
			http.Error(w, "Internal server error", http.StatusInternalServerError)
			return
		}
		u := user{un, bs, f, l, s} // sを追加した
		dbUsers[un] = u

		http.Redirect(w, req, "/", http.StatusSeeOther)
		return
	}

	tpl.ExecuteTemplate(w, "signup.gohtml", nil)
}

そして挙動は、ここではVIPページを少し変化させましょう。

main.go vip
func vip(w http.ResponseWriter, req *http.Request) {
	u := getUser(req)
	if !alreadyLoggedIn(req) {
		http.Redirect(w, req, "/", http.StatusSeeOther)
		return
	}
	if u.Permission != "dog" {
		http.Error(w, "No dogs allowed.", http.StatusForbidden)
		return
	}
	tpl.ExecuteTemplate(w, "vip.gohtml", u)
}

それでは実行します。

$ go run *.go


このように表示されたと思います。ここではdogを選択してみましょう。

そしてVIPページへ

↓↓↓↓↓↓↓↓↓↓
↓↓↓↓↓↓↓↓↓↓
↓↓↓↓↓↓↓↓↓↓
↓↓↓↓↓↓↓↓↓↓
↓↓↓↓↓↓↓↓↓↓

がびーーん!
ということで、パーミッションでした。