Базовая аутентификация для статических ресурсов - PullRequest
0 голосов
/ 28 сентября 2018

Как я могу добавить базовую аутентификацию к моим статическим ресурсам?С кодом ниже, я могу просматривать любые файлы, которые находятся в папке меток.Я знаю, что в этом вопросе объяснялось, как это сделать.Но как бы я установил заголовок, когда http.ResponseWriter не используется?

package main

import (
    "github.com/gorilla/mux"
    "log"
    "net/http"
    "os"
)

func main() {
    port := GetPort()
    log.Println("[-] Listening on...", port)

    r := mux.NewRouter()
    r.PathPrefix("/labels/").Handler(http.StripPrefix("/labels/", http.FileServer(http.Dir("./labels/"))))

    err := http.ListenAndServe(port, r)
    log.Fatal(err)
}

// GetPort is for herkou deployment
func GetPort() string {
    port := os.Getenv("PORT")
    if port == "" {
        port = "4747"
        log.Println("[-] No PORT environment variable detected. Setting to ", port)
    }
    return ":" + port
}

Ответы [ 2 ]

0 голосов
/ 28 сентября 2018
package main

import (
    "github.com/gorilla/mux"
    "log"
    "net/http"
    "os"
)

func main() {
    port := GetPort()
    log.Println("[-] Listening on...", port)

    r := mux.NewRouter()
    r.PathPrefix("/labels/").Handler(http.StripPrefix("/labels/", ServeLabels(http.FileServer(http.Dir("./labels/")))))

    err := http.ListenAndServe(port, r)
    log.Fatal(err)
}

func ServeLabels(h http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        w.Header().Set("WWW-Authenticate", `Basic realm="mydomain"`)
        h.ServeHTTP(w, r)
    })
}

// GetPort is for herkou deployment
func GetPort() string {
    port := os.Getenv("PORT")
    if port == "" {
        port = "4747"
        log.Println("[-] No PORT environment variable detected. Setting to ", port)
    }
    return ":" + port
}

что-то вроде этого, или вы можете просто пойти дальше и использовать промежуточное программное обеспечение Gorilla Mux.

0 голосов
/ 28 сентября 2018

Создайте оболочку вокруг каждого обработчика для передачи запроса от промежуточного программного обеспечения для аутентификации, которое будет пересылать запрос дальше после выполнения аутентификации, иначе верните ответ с ошибкой как

func authentication(next http.Handler) http.Handler {
  return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    log.Println("Executing authentication")
    next.ServeHTTP(w, r)
  })
}

// open the dialog to download pdf files.
func dowloadPdf(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Disposition", "attachment; filename=YOUR_FILE")
    w.Header().Set("Content-Type", r.Header.Get("Content-Type"))
    w.Write([]byte("File downloaded"))
}

func main(){
     pdfHandler := http.HandlerFunc(dowloadPdf)
     http.Handle("/servepdf", authentication(pdfHandler))
     http.ListenAndServe(":3000", nil)
}

Но если я учту факт тамнет необходимости иметь аутентификацию при обслуживании статических файлов, таких как html, css, js и т. д. Было бы лучше создать обработчик для обслуживания pdf-файлов после аутентификации пользователей.

Вы также можете использовать negorni промежуточное программное обеспечение с гориллой Mux, а не создание пользовательских промежуточных программ.

...