Diese Frage in ziemlich vagen und architektonischen Entscheidungen muss getroffen werden, um den Datenzugriff zu optimieren und die Dateien zu sichern.
Hier ist jedoch eine einfache Lösung, die Ihrem Anwendungsfall dienen könnte.
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")
}
}
Hier verwendete ich eine Karte, um die Berechtigungen von Dateien zu speichern. Ich würde vorschlagen, dass Sie stattdessen für eine SQL-Tabelle gehen.
Anstatt sie direkt vom Webserver direkt bereitzustellen, fügen Sie einfach eine Verifizierungsschicht auf der Route hinzu, die ein Benutzer anfordert, eine seiner Dateien anzuzeigen. –
können Sie 'http.ServeFile()' verwenden, um eine Datei zu liefern. Mit einigen Controller-Logik natürlich –