この質問は、データアクセスを最適化してファイルを保護するために、かなり曖昧でアーキテクチャ上の決定を下す必要があります。
ただし、ここではユースケースに役立つ簡単な解決策があります。
package main
import (
"fmt"
"mime"
"net/http"
"path/filepath"
)
//UserFilesMap is the map that contains
var UserFilesMap map[string]FilePermission
type FilePermission map[string]struct{}
//FileServer is the function that serves files
func FileServer(w http.ResponseWriter, r *http.Request) {
//get the file path the user wants to access
filename := r.URL.Path[9:]
var uname, pass string
var ok bool
if uname, pass, ok = r.BasicAuth(); !ok {
w.WriteHeader(http.StatusForbidden)
return
}
if !(uname == "user" && pass == "1234") {
w.WriteHeader(http.StatusForbidden)
return
}
//Checking if user has permission to the file
if _, ok := UserFilesMap[uname][filename]; !ok {
w.WriteHeader(http.StatusForbidden)
return
}
w.Header().Set("Content-Type", mime.TypeByExtension(filepath.Ext(filename)))
http.ServeFile(w, r, "files/"+filename)
}
func main() {
UserFilesMap = make(map[string]FilePermission)
// UserFilesMap["user"] = FilePermission{"xyz.txt": struct{}{}}
UserFilesMap["user"] = FilePermission{"abc.txt": struct{}{}}
http.HandleFunc("/getFile/", FileServer)
if err := http.ListenAndServe(":8080", nil); err != nil {
fmt.Println("Error in ListenAndServe")
}
}
ここでは、ファイルのアクセス許可を格納するマップを使用しました。代わりにSQLテーブルを使うことをお勧めします。
Webサーバーから直接rawを提供する代わりに、ユーザーが自分のファイルの1つを表示するように確認するルート上に確認レイヤーを追加するだけです。 –
'http.ServeFile()'を使ってファイルを提供することができます。いくつかのコントローラーロジックでは、もちろん –