iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 16
0
Modern Web

從coding到上線-打造自己的blog系統系列 第 16

Day16 權限管理

auth

現在來驗證token,進入database寫入

DELIMITER ;;
CREATE PROCEDURE `check_token`(
  userid INT UNSIGNED,
  code CHAR(44),
  ownerid INT UNSIGNED
)
BEGIN
  SELECT 1 
  FROM `token`
  JOIN `owner`
    ON `owner`.`uid` = userid
      AND `owner`.`oid` = ownerid
  WHERE `token`.`uid` = userid
    AND `token`.`accesscode` = code;
END ;;
DELIMITER ;

解釋:

  • 需要owner的許可才能操控blog,所以把owner id也放進來檢驗,判斷這個owner是否屬於user

在database/auth.go補上

// generate a new access token
func CheckAccessToken(uid, code, oid string) (bool, error) {
	return db.SQL("call check_token(?, ?, ?)", uid, code, oid).Exist()
}

在serve/account.go補上

// check access token vaild
func CheckAccessToken(c *gin.Context) {
	// get cookie param
	param, err := common.GetCookieParam(c, "AccessToken");
	if err != nil {
		c.Abort()
		return
	}

	if has, err := database.CheckAccessToken(param.Get("uid"), param.Get("AccessCode"), c.PostForm("oid")); err != nil {
		log.Warn(c, 1500006, err, "Sorry, something error", "database error of check access token")
		c.Abort()
		return
	} else if !has {
		log.Warn(c, apperr.ErrPermissionDenied, err, "access token parse fail")
		c.Abort()
		return
	}
}

解釋:

  • c.Abort()會停止gin繼續往下跑middleware與後續的service

在middleware package創建auth.go寫入

package middleware

import (
	"app/serve"
	"github.com/gin-gonic/gin"
)

func Auth() gin.HandlerFunc {
	return func(c *gin.Context) {

		serve.CheckAccessToken(c)
		if c.IsAborted() {
			return
		}

		c.Next()
	}
}

基本上除了read以外的操作都是需要所有人許可才能操作,所以我們把這個middleware加到read以外的路由上,打開router/main.go,MainRouter function裡會長這樣

/*auth*/
owner := r.Group("/:owner")
{
	owner.Use(middleware.Auth())	//加在這邊
	owner.POST("", serve.CreateOwner)
	owner.PUT("", serve.UpdateOwner)
	owner.DELETE("", serve.DelOwner)
	work := owner.Group("/*work")
	{
		work.POST("", serve.CreateBlog)
		work.PUT("", serve.UpdateBlog)
		work.DELETE("", serve.DelBlog)
	}
}

總結

現在只剩下js, css等資源加載要處理,明天會把他解決

目前的工作環境

.
├── app
│   ├── apperr
│   │   ├── error.go
│   │   └── handle.go
│   ├── common
│   │   └── cookie.go
│   ├── config
│   │   └── app
│   │       ├── app.yaml
│   │       └── error.yaml
│   ├── database
│   │   ├── auth.go
│   │   ├── connect.go
│   │   ├── error.go
│   │   ├── main.go
│   │   └── scheme.go
│   ├── go.mod
│   ├── go.sum
│   ├── log
│   │   ├── logger.go
│   │   └── logging.go
│   ├── main.go
│   ├── middleware
│   │   ├── auth.go
│   │   ├── error.go
│   │   └── log.go
│   ├── router
│   │   ├── account.go
│   │   ├── host_switch.go
│   │   └── main.go
│   ├── serve
│   │   ├── account.go
│   │   ├── auth.go
│   │   ├── main.go
│   │   └── main_test.go
│   ├── setting
│   │   └── setting.go
│   ├── util
│   │   ├── debug
│   │   │   ├── stack.go
│   │   │   └── stack_test.go
│   │   ├── file
│   │   │   └── file.go
│   │   ├── hash
│   │   │   ├── hash.go
│   │   │   └── hash_test.go
│   │   └── random
│   │       └── random.go
│   └── view
│       ├── css
│       ├── html
│       │   ├── component
│       │   │   ├── blogContainer.html
│       │   │   └── blogList.html
│       │   └── meta
│       │       ├── head.html
│       │       └── index.html
│       └── js
└── database
    └── maindata

上一篇
Day15 登入
下一篇
Day17 檔案處理
系列文
從coding到上線-打造自己的blog系統30

尚未有邦友留言

立即登入留言