湖南網(wǎng)站建設(shè)小公司排名廣州網(wǎng)站優(yōu)化外包
序言:
要在 Go 項(xiàng)目中實(shí)現(xiàn)類(lèi)似 Java Shiro 的權(quán)限控制中間件,我們可以分為幾個(gè)步驟來(lái)實(shí)現(xiàn)用戶(hù)的菜單訪問(wèn)權(quán)限和操作權(quán)限控制。以下是一個(gè)基本的實(shí)現(xiàn)框架步驟:
目錄
一、數(shù)據(jù)庫(kù)設(shè)計(jì)
二、中間件實(shí)現(xiàn)
三、使用中間件
四、用戶(hù)權(quán)限管理
五、測(cè)試
一、數(shù)據(jù)庫(kù)設(shè)計(jì)
確保用戶(hù)、權(quán)限和菜單表結(jié)構(gòu)合理。例如:
用戶(hù)表(users)
CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(255) NOT NULL,password VARCHAR(255) NOT NULL
);
權(quán)限表(permissions)
CREATE TABLE permissions (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(255) NOT NULL
);
菜單表(menus)
CREATE TABLE menus (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(255) NOT NULL,permission_id INT,FOREIGN KEY (permission_id) REFERENCES permissions(id)
);
用戶(hù)權(quán)限關(guān)聯(lián)表(user_permissions)
CREATE TABLE user_permissions (user_id INT,permission_id INT,PRIMARY KEY (user_id, permission_id),FOREIGN KEY (user_id) REFERENCES users(id),FOREIGN KEY (permission_id) REFERENCES permissions(id)
);
二、中間件實(shí)現(xiàn)
創(chuàng)建一個(gè)中間件,用于檢查用戶(hù)的權(quán)限。示例代碼如下:
package middlewareimport ("net/http""github.com/dgrijalva/jwt-go" // 用于處理 JWT
)type Claims struct {UserID uint `json:"user_id"`Permissions []string `json:"permissions"`jwt.StandardClaims
}func AuthMiddleware(allowedPermissions []string) http.HandlerFunc {return func(w http.ResponseWriter, r *http.Request) {tokenStr := r.Header.Get("Authorization")token, err := jwt.Parse(tokenStr, func(token *jwt.Token) (interface{}, error) {// 驗(yàn)證 token 的簽名return []byte("your-secret-key"), nil})if err != nil || !token.Valid {http.Error(w, "Unauthorized", http.StatusUnauthorized)return}claims, ok := token.Claims.(Claims)if !ok || !checkPermissions(claims.Permissions, allowedPermissions) {http.Error(w, "Forbidden", http.StatusForbidden)return}// 繼續(xù)處理請(qǐng)求next.ServeHTTP(w, r)}
}func checkPermissions(userPermissions, allowedPermissions []string) bool {for _, userPerm := range userPermissions {for _, allowedPerm := range allowedPermissions {if userPerm == allowedPerm {return true}}}return false
}
三、使用中間件
在路由中使用這個(gè)中間件:
package mainimport ("net/http""github.com/gorilla/mux""your_project/middleware"
)func main() {r := mux.NewRouter()r.HandleFunc("/admin", AdminHandler).Methods("GET")r.Use(middleware.AuthMiddleware([]string{"admin"})) // 僅允許 admin 權(quán)限用戶(hù)訪問(wèn)http.ListenAndServe(":8080", r)
}func AdminHandler(w http.ResponseWriter, r *http.Request) {w.Write([]byte("Welcome to the admin panel"))
}
四、用戶(hù)權(quán)限管理
確保用戶(hù)在登錄后獲取其權(quán)限并存儲(chǔ)在 JWT 中??梢栽诘卿洉r(shí)查找用戶(hù)的權(quán)限,并在生成 JWT 時(shí)添加它們。
五、測(cè)試
使用 Postman 或其他工具進(jìn)行測(cè)試,確保你的權(quán)限控制正常工作。這個(gè)框架是一個(gè)基本的實(shí)現(xiàn),具體可以根據(jù)你的需求進(jìn)一步擴(kuò)展和優(yōu)化,比如加入角色管理、復(fù)雜的權(quán)限結(jié)構(gòu)等