🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

Q&A

1回答

1333閲覧

Sessionをsetして情報を表示しようとしたら別の人の情報が表示されてしまう

otukonkon

総合スコア5

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

0グッド

0クリップ

投稿2019/12/10 06:06

編集2019/12/10 07:43

前提・実現したいこと

いつもお世話になっております。
現在、sessionの勉強の為、下記の機能を作成したいと考えております。
go言語でginを使用しsessionを利用してログイン後にログインした人の「ログインID」と「ログイン名」を表示する
という機能を作成しようとしております。

発生している問題・エラーメッセージ

「ログインID」、「ログイン名」を表示する画面はログイン後にリンクを押下し遷移して表示するのですが、 最初にログインした人がリンクを押下する前に別の人がログインした場合、最初にログインした人がリンクを 押下して遷移すると後からログインした人の「ログインID」、「ログイン名」が表示されてしまいます。 後からログインした人にsessionが上書きされているのですが、なにか解決策などはありますでしょうか。 どなたかご教示のほどお願いいたします。 テーブル内容(テストデータ) 1レコード UserId:1 UserName:test1 2レコード UserId:2 UserName:test2 例) 1:Aがログインする(UserId:1) 2:Bがログインする(UserId:2) 3:Aがリンクを押下する 4:Aがリンクを押下したのにBの「ログインID」、「ログイン名」が表示 下記に実際の値を記載いたします。 1:ユーザー「test1」でログインする。 2:ユーザー「test2」でログインする。 3:「test1」が「/userinfo」リンクを押下する。 4:「test1」でリンクを押下したのに「test2」の「UserId」、「UserName」が表示されてしまう。

該当のソースコード

go

1package main 2 3import ( 4 "fmt" 5 6 "github.com/gin-contrib/sessions" 7 "github.com/gin-contrib/sessions/cookie" 8 "github.com/gin-gonic/gin" 9 _ "github.com/go-sql-driver/mysql" 10 "github.com/jinzhu/gorm" 11) 12 13// Userinfo is : ユーザー情報テーブル定義 14type Userinfo struct { 15 Id int `gorm:"primary_key" "column:id"` 16 UserId int `gorm:"column:user_id"` 17 UserName string `gorm:"column:user_name"` 18 Password string `gorm:"column:password"` 19} 20 21// DB接続 22func gormConnect() *gorm.DB { 23 DBMS := "mysql" 24 USER := "root" 25 PASS := "root" 26 PROTOCOL := "tcp(127.0.0.1:3307)" 27 DBNAME := "chatdb" 28 PARSETIME := "parseTime=true" 29 30 CONNECT := USER + ":" + PASS + "@" + PROTOCOL + "/" + DBNAME + "?" + PARSETIME 31 fmt.Println("DB情報:" + CONNECT) 32 db, err := gorm.Open(DBMS, CONNECT) 33 34 if err != nil { 35 panic(err.Error()) 36 } 37 return db 38} 39 40func main() { 41 router := gin.Default() 42 store := cookie.NewStore([]byte("secret")) 43 router.Use(sessions.Sessions("mysession", store)) 44 router.Static("/static", "../static") 45 router.LoadHTMLGlob("../html/*.html") 46 47 // ログイン画面 48 router.GET("/", func(c *gin.Context) { 49 c.HTML(200, "login.html", gin.H{}) 50 }) 51 52 // ログインボタン押下時に発火 53 router.POST("/login", func(c *gin.Context) { 54 user := c.PostForm("user") 55 pass := c.PostForm("pass") 56 var userinfo Userinfo 57 info, userinfo := UserGet(user, pass) 58 if info != 0 { 59 session := sessions.Default(c) 60 if session.Get("UserId") != userinfo.UserId { 61 CreateSession(c, userinfo.UserId) 62 } 63 c.HTML(200, "test.html", gin.H{"UserId": session.Get("UserId")}) 64 } 65 c.Redirect(302, "/") 66 }) 67 68 router.GET("/userinfo", func(c *gin.Context) { 69 db := gormConnect() 70 session := sessions.Default(c) 71 userId := session.Get("UserId") 72 var userInfo Userinfo 73 db.Where("user_Id = ?", userId).Find(&userInfo) 74 id := userInfo.UserId 75 name := userInfo.UserName 76 c.HTML(200, "user.html", gin.H{"id": id, "name": name}) 77 }) 78 79 router.Run(":8080") 80} 81 82// ユーザ確認 83func UserGet(user, pass string) (int, Userinfo) { 84 db := gormConnect() 85 var userInfo Userinfo 86 cnt := 0 87 // db.Where("user_Name = ?", user).Find(&userInfo).Count(&cnt) 88 db.Where("user_Name = ?", user).Find(&userInfo).Count(&cnt) 89 90 return cnt, userInfo 91} 92 93// セッション作成 94func CreateSession(c *gin.Context, user int) { 95 session := sessions.Default(c) 96 session.Set("UserId", user) 97 session.Save() 98} 99

html

1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4 <meta charset="UTF-8"> 5 <title>TEST</title> 6</head> 7<body> 8 <p>ID:{{.UserId}}</p> 9 <a href="/userinfo">ユーザー情報</a> 10</body> 11</html>

html

1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4 <meta charset="UTF-8"> 5 <title>TEST</title> 6</head> 7<body> 8 <p>ID:{{.id}}</p> 9 <p>NAME:{{.name}}</p> 10</body> 11</html>

html

1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4 <meta charset="UTF-8"> 5 <title>ログイン</title> 6 <style type="text/css"> 7 @import url("/static/css/login.css"); 8 </style> 9</head> 10<body> 11 <div class="loginbody"> 12 <div class="login-div"> 13 <form name="logininfo" action="/login" method="POST"> 14 <ul> 15 <li class="login-li"> 16 <div><input type="text" name="user" value=""></div> 17 <div><input type="text" name="pass" value=""></div> 18 <div><input type="submit" name="submit" value="ログイン"></div> 19 </li> 20 </ul> 21 </form> 22 </div> 23 </div> 24</body> 25</html>

試したこと

sessionが既に作成されているかどうか判別する為にif文をつけてみたのですが
(上記、main.goの59行目「if session.Get("UserId") != userinfo.UserId)」の部分
ユーザー「test1」でログイン後にユーザー「test2」でログインするとやはりtest1の情報表示でtest2の情報(UserId:2,UserName:test2)が
表示されてしまいました。

補足情報(FW/ツールのバージョンなど)

FW:"github.com/gin-gonic/gin"

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mattn

2019/12/10 07:03

試した事、その際に出た値(userid が 0 など)を書くと解答付きやすいです。
otukonkon

2019/12/10 07:45

ご指摘ありがとうございます。編集させていただきました。
guest

回答1

0

私の手元で動かして確認していないので推測になりますが、おそらく同じブラウザ上で実施しているのでブラウザのクッキー情報が上書きされ、

ユーザー「test1」でログイン後にユーザー「test2」でログインするとやはりtest1の情報表示でtest2の情報(UserId:2,UserName:test2)が

表示されてしまいました。

の挙動になると考えられます。

test1のユーザはChrome、test2のユーザはFirefoxなど異なったブラウザを使って一度検証してみてください。

投稿2019/12/22 09:37

momotaro98

総合スコア19

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問