###前提・実現したいこと
ginを使ったWebアプリケーション開発で、HandlerFuncを利用してアクセス制限を行いたい。
- 未ログインユーザーのHandlerFunc
Auth()
- ログインユーザーのHandlerFunc
AuthRequired()
- ログインユーザー&&管理ユーザーのHandlerFunc
AuthAdminRequired()
その際に、上記の三種類を使用したRoutingを設定したい。
###発生している問題・エラーメッセージ
Routing
auth := s.Engine.Group("/") auth.Use(controller.Auth()) auth.POST("/login", controller.Login) auth_required := s.Engine.Group("/") auth_required.Use(controller.AuthRequired()) auth_required.GET("/logout", controller.Logout) auth_required.GET("/index", controller.Index) apiv1 := auth_required.Group("/api/v1") apiv1.GET("/hoges", controller.GetHoges) auth_admin := auth_required auth_admin.Use(controller.AuthAdminRequired()) auth_admin.GET("/users", controller.GetUsers)
HandlerFunc
func AuthRequired() gin.HandlerFunc { return func(c *gin.Context) { if !LoggedIn(c) { c.Redirect(301, "/login") } } } func Authed() gin.HandlerFunc { return func(c *gin.Context) { if LoggedIn(c) { c.Redirect(301, "/index") } } } func AuthAdminRequired() gin.HandlerFunc { return func(c *gin.Context) { if !IsAdmin(c) { c.Redirect(301, "/index") } } }
※IsAdmin
、LoggedIn
はセッションの情報を元にユーザーの属性を判定しています。
上記のコードで、以下のような問題が発生します
- 一般ユーザーログイン状態ですぐに
/logout
へアクセス→正常にログアウトできる - 一般ユーザーログイン状態で管理ユーザーページへアクセス→indexへリダイレクト→
/logout
へアクセス→ログアウトできない
デバッグしてみると、/logout
にアクセスしてるはずなのですが、内部的には/login
が呼び出されているみたいです。
(/logout
→ ??? → Authed()
→ /index
へリダイレクト → AuthRequired()
→ /index
表示)
※1 この時にAuthAdminRequired()
が呼び出された形跡はありません。
※2 /login
が呼び出された際に[GIN-debug] [WARNING] Headers were already written. Wanted to override status code 301 with 200
という警告が出ています。
※3 logout処理のメソッドは呼び出されていません。
※4 管理ユーザーでログインした場合にはこの事象は発生しません。
恐らくRoutingの記述のミスだとは思うのですが、解決方法をご教授頂きたいです・・・
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。